Spring Cloud Alibaba介绍


一、Nacos部署

1. 应用下载

进入 Nacos 下载页面选择对应版本并下载至本地,官网直达:Nacos

2. 持久化

在正式之前需要修改 Nacos 的相关配置,如服务模式与数据的持久化配置。

MySQL 中新建数据库 nacos ,然后解压上一步下载的文件并运行 /conf/mysql-schema.sql 脚本文件。

创建数据库之后修改解压目录下的 /conf/application.properties 文件,找到下图中配置取消注释并替换为你的数据库配置。

3. 服务部署

完成上述步骤之后即可启动 Nacos 服务,这里以 Linux 为例,进入解压后的 bin 目录,编辑 startup.sh 脚本将默认启动模式设置为单体模式。

将图中的 mode 修改为 standalone ,然后通过命令 sh startup.sh 启动服务。

启动服务后访问 ip:8848/nacos 即可看到下图内容。

二、服务注册

在上一篇文章中介绍了服务中心的创建与服务激活,在 Nacos 中其自身即服务注册中心,因此无需再自建注册中心直接使用 Nacos 即可,因此这里直接新建 nacos-client 工程模拟服务通过 Nacos 实现服务注册。

之前的文章中提到过 Spring Cloud 的版本与 Spring Boot 的版本相互关联,这里引入的为 Finchley 版本因此 Spring Boot 版本需为 2.0.x

1. Pom依赖

在工程的 POM 文件中导入 alibabaFinchley 依赖,同时引入 nacos-discovery 用于服务注册。

文中的涉及的工程中 Spring Boot 版本均为 2.0.x 版本且都导入 alibabaFinchley 依赖,后续将省略不再具体列出。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.5.RELEASE</version>
</parent>

<artifactId>nacos-client</artifactId>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Finchley.SR1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>0.2.2.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

2. 项目配置

在工程的 yml 文件中添加下述内容,其中 server-addrNacos 服务地址。

server:
  port: 8091

spring:
  application:
    name: nacos-client
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.0.20:8848

3. 测试接口

在这里为了后续测试添加了一个测试接口。

@RestController
@RequestMapping("/api/client")
public class ClientController {

    @GetMapping("/demo")
    public String demo() {
        return "Hello world!";
    }
}

4. 注册激活

在工程启动类上添加 @EnableDiscoveryClient 注解激活服务注册。

@EnableDiscoveryClient
@SpringBootApplication
public class NacosClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosClientApplication.class, args);
    }
}

完成后启动项目访问 Nacos 服务页面即可看到 nacos-client 已成功实现服务注册。

三、服务消费

Eureka 微服务文章中讲解了如何实现服务之间的通讯消费,在 Alibaba 中由 Nacos 注册服务之后同理可通过 LoadBalancerClientFeign 实现服务消费,这里以之前 Feign 消费为例。

1. Pom依赖

新建 nacos-feign 工程,在模块依赖中添加 openfeign 依赖,略去 Spring parentDalston

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <!-- Feign service -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
</dependencies>

2. 项目配置

在工程的 YML 配置文件设置 Nacos 服务地址进行服务注册。

server:
  port: 8092

spring:
  application:
    name: nacos-feign
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.0.20:8848

3. 调用示例

新建 FeignService 接口并通过 @FeignClient 注解指定目标服务方,其中 @GetMapping 注解配置目标服务的接口地址。

@FeignClient("nacos-client")
public interface FeignService {

    @GetMapping("/api/client/demo")
    String demo();
}

完成 FeignService 配置之后新建测试接口,通过 @Autowired 注入 FeignService 实例并实现服务调用。

@RestController
@RequestMapping("/api/nacos/feign")
public class FeignController {

    @Autowired
    private FeignService feignService;

    @GetMapping("/demo")
    public String demo() {
        return feignService.demo();
    }

}

4. 注册激活

在项目启动类添加 @EnableDiscoveryClient 注解激活服务注册,其中 @EnableFeignClients 注解用于指定 FeignService 等接口包路径用于启动扫描。

@EnableFeignClients(basePackages = "xyz.ibudai.service")
@EnableDiscoveryClient
@SpringBootApplication
public class NacosFeignApplication {

    public static void main(String[] args) {
        SpringApplication.run(NacosFeignApplication.class, args);
    }
}

完成后同时启动 nacos-clientnacos-feign 工程,访问 Nacos 服务列表可以看见两个服务都已注册成功。

通过 API 工具请求 nacos-feign 服务的 /demo 接口,可以看到成功实现服务 nacos-client 中的接口请求并返回结果。

四、配置中心

Nacos 除了实现服务注册中心之外同时提供了另一重要作用——分布式配置中心,即通过 Nacos 实现各个服务模块的 YML 配置文件的统一托管。

1. Pom依赖

新建 nacos-config 工程,在工程中添加 nacos-config 依赖,略去 Spring parentalibaba 等导入依赖。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- Nacos discovery -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <!-- Nacos config -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
</dependencies>

2. Nacos配置

Nacos 页面访问 配置管理 -> 配置列表 ,在左上角选择 创建配置

其中 Data Id 设为 nacos-configGROUP 选用默认值即可,配置格式选择 yaml ,并在配置内容中添加测试信息,具体配置参考下图。

3. 工程配置

在工程 resources 目录下新建 bootstrap.yml 配置文件添加如下内容,注意不是使用默认的 application.yml 文件,因为前者的加载优先级更高。

其中 application.name 需要和上述 Nacos 中创建的文件同名,如创建了配置文件为 nacos-config.yml,则这里配置文件的应用名则需要为:nacos-config

下述配置中的 groupdiscoveryconfig 中的 namespace 两项可以略去不填,默认值分别为 DEFAULT_GROUPpublic 。其中 discoveryconfig 两组配置分别对应 Nacos 配置页面的 服务列表配置列表

server:
  port: 8093

spring:
  application:
    name: nacos-config
  cloud:
    nacos:
      # Default: "DEFAULT_GROUP"
      group: DEFAULT_GROUP
      discovery:
        # Default: public
        namespace: public
        server-addr: 192.168.0.20:8848
      config:
        # namespace, use id not name
        namespace: ${spring.cloud.nacos.discovery.namespace}
        username: nacos
        password: nacos
        # suffix, default: properties
        file-extension: yml
        server-addr: ${spring.cloud.nacos.discovery.server-addr}

4. 公共配置

Nacos 同时支持公共服务的配置,通过 shared-dataidsrefreshable-dataids 属性配置,前端指定文件名称,后者配置时候开启动态刷新(即配置变更无需重复服务)。

通过公共配置服务即可实现基础配置的复用,如系统的数据库连接配置与日志监控配置等信息,无需为每个服务模块编写重复配置,各个模块可选择是否导入即可。

如下示例中我们新建了公共配置 micro-common.yml 配置并添加了一个测试属性 info.common

在上述的 nacos-config 工程中 bootstrap.yml 文件的基础上添加下述内容读取公共配置,当 shared-dataids 中指定了多个配置时,定义越靠后的配置其文件中相同属性的优先级更高。

如定义了 shared-dataids: a.yml, b.yml 两个公共配置,当 a.ymlb.yml 中存在相同配置时最终将会应用 b.yml 中的配置。

spring:
  cloud:
    nacos:
      config:
        # Newer load config will override old
        shared-dataids: micro-common.yml
        # Auto refresh config
        refreshable-dataids: micro-common.yml

5. 命名空间

Nacos 中通过命名空间 namespace 可实现多个项目的注册管理,不同 namespace 之间相互独立互不影响。

因此即便存在多个微服务项目通过 namespace 也以通过同一个 nacos 服务实现统一管理, namespace 创建如下,注意创建的 namespace 在工程 bootstrap.yml 文件配置时填写为 命名空间ID 而非 命名空间名

创建命名空间之后访问 配置列表服务列表 即可看见新建命名空间。

6. 服务测试

新建服务测试接口通过 @Value 注解读取 Nacos 中的配置信息。

@RestController
@RequestMapping("/api/config")
public class ConfigController {

    @Value("${info.name}")
    private String infoName;

    @Value("${common.name}")
    private String commonName;

    @GetMapping("/name")
    public String name() {
        return infoName + " - " + commonName;
    }
}

7. 注册激活

如果仅测试分布式配置中心是无需开启服务注册,但在更多的应用场景中其都是与服务注册相耦合。

@EnableDiscoveryClient
@SpringBootApplication
public class NacosConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(NacosConsumerApplication.class, args);
    }
}

完成后启动项目通过 API 工具请求 /name 测试接口可以看到成功读取 Nacos 中配置的信息。


Talk is cheap, show me you code。

文中示例工程已上传 GitHub仓库直达

参考链接:Spring Cloud 从入门到精通


文章作者: 烽火戏诸诸诸侯
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 烽火戏诸诸诸侯 !
  目录