SpringBoot + Spring Cloud Alibaba + Nacos实现服务管理

1、参考文档

Spring Cloud Alibaba参考文档 https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/zh-cn/index.html
Spring Cloud Alibaba官方文档 https://github.com/alibaba/spring-cloud-alibaba/wiki/

2、引入 Alibaba 依赖

每个 SpringBoot 都有对应的 Spring Cloud 以及 Spring Cloud Alibaba 版本,为了避免依赖冲突,引入依赖前请查阅 版本说明。
以下是 SpringBoot 2.6.11 对应的版本依赖。
https://github.com/alibaba/spring-cloud-alibaba/wiki/版本说明


    2.6.11
    2021.0.4
    2021.0.4.0



    
        
        
            org.springframework.boot
            spring-boot-dependencies
            ${spring.boot.version}
            pom
            import
        
        
        
        
            org.springframework.cloud
            spring-cloud-dependencies
            ${spring.cloud.version}
            pom
            import
        

        
        
            com.alibaba.cloud
            spring-cloud-alibaba-dependencies
            ${spring.cloud.alibaba.version}
            pom
            import
        
    

    2.6.11
    2021.0.4
    2021.0.4.0



    
        
        
            org.springframework.boot
            spring-boot-dependencies
            ${spring.boot.version}
            pom
            import
        
        
        
        
            org.springframework.cloud
            spring-cloud-dependencies
            ${spring.cloud.version}
            pom
            import
        

        
        
            com.alibaba.cloud
            spring-cloud-alibaba-dependencies
            ${spring.cloud.alibaba.version}
            pom
            import
        
    

依赖引入后,若无爆红,terminal 执行命令:

mvn clean install

有 finish 提示代表项目依赖成功引入。

回到顶部

3、启动 Nacos 服务

Nacos 是动态的服务注册与发现、配置管理平台,想详细了解 Nacos 请查阅 Nacos 控制台手册,这里粗略地给出压缩包方式的安装步骤。

3.1、下载

压缩包下载地址:https://github.com/alibaba/nacos/releases。

选择 .zip 后缀文件进行下载,下载完成后解压:

SpringBoot + Spring Cloud Alibaba + Nacos实现服务管理_第1张图片

3.2、启动

解压完成后, 进入 bin 目录, cmd 执行命令:

  • ​Linux/Unix/Mac:sh startup.sh -m standalone,
  • 如果是 ubuntu 系统或提示报错,执行bash startup.sh -m standalone (standalone 代表着单机模式运行,非集群模式)。
  • Windows: startup.cmd -m standalone

3.3、访问

启动成功访问地址:http://localhost:8848/nacos
配置中心界面如下图:
SpringBoot + Spring Cloud Alibaba + Nacos实现服务管理_第2张图片到这里 Nacos 启动步骤结束。

4、创建 nacos-provider 服务提供者

在上文讲到 nacos 有服务发现的功能,在这里需要两个角色

nacos-provider: 注册进入 nacos-server, 对外暴露服务
nacos-consumer: 注册进入 nacos-server, 调用 nacos-provider的服务。

4.1、引入依赖

首先创建 nacos-provider模块,由于使用了多模块聚合项目,这里直接添加spring-cloud-starter-alibaba-nacos-discovery 依赖:



    com.alibaba.cloud
    spring-cloud-starter-alibaba-nacos-discovery

4.2、配置 yml 文件

配置 yml 首先需要知道每个参数代表的含义,下面是配置列表:

配置项 Key 默认值 说明
服务端地址 spring.cloud.nacos.discovery.server-addr Nacos Server
服务名 spring.cloud.nacos.discovery.service ${spring.application.name} 注册的服务名
权重 spring.cloud.nacos.discovery.weight 1 取值范围 1 到 100数值越大,权重越大
网卡名 spring.cloud.nacos.discovery.network-interface 当IP未配置时
注册的IP地址 spring.cloud.nacos.discovery.ip 优先级最高
注册的IP地址类型 spring.cloud.nacos.discovery.ip-type IPv4 可以配置IPv4和IPv6两种类型,如果网卡同类型IP地址存在多个,希望制定特定网段地址,可使用spring.cloud.inetutils.preferred-networks配置筛选地址
注册的端口 spring.cloud.nacos.discovery.port -1 默认情况下不用配置,会自动探测
命名空间 spring.cloud.nacos.discovery.namespace 常用场景之一是不同环境的注册的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等
AccessKey spring.cloud.nacos.discovery.access-key 当要上阿里云时,阿里云上面的一个云账号名
SecretKey spring.cloud.nacos.discovery.secret-key 当要上阿里云时,阿里云上面的一个云账号密码
Metadata spring.cloud.nacos.discovery.metadata 使用Map格式配置,用户可以根据自己的需要自定义一些和服务相关的元数据信息
日志文件名 spring.cloud.nacos.discovery.log-name
集群 spring.cloud.nacos.discovery.cluster-name DEFAULT Nacos集群名称
接入点 spring.cloud.nacos.discovery.endpoint 地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址
是否集成Ribbon ribbon.nacos.enabled true 一般都设置成true即可
是否开启Nacos Watch spring.cloud.nacos.discovery.watch.enabled true 可以设置成false来关闭 watch

接下来配置 yml 文件:

server:
  port: 9001
spring:
  application:
    ## 指定服务名称,在nacos中的名字
    name: nacos-provider
  cloud:
    nacos:
      discovery:
        # nacos的服务地址,nacos-server中IP地址:端口号
        server-addr: 127.0.0.1:8848
management:
  endpoints:
    web:
      exposure:
        ## yml文件中存在特殊字符,必须用单引号包含,否则启动报错
        include: '*'

4.3、开启服务发现
在启动类添加@EnableDiscoveryClient开启服务发现的功能:

@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {

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

}

4.4、编写测试接口
作为服务提供者,需要提供接口给服务消费者,下面是随意编写的测试接口:

@RestController
@RequestMapping("/nacos")
public class NacosController {

    @GetMapping("/test")
    public String test(){
        return "成功访问服务者接口";
    }
}

4.5、启动项目
项目启动成功后,访问 nacos控制台 -> 服务管理 -> 服务列表,可以看到 nacos-provider已成功注册进来:
SpringBoot + Spring Cloud Alibaba + Nacos实现服务管理_第3张图片
5、创建 nacos-consumer 服务消费者
既然已经有了服务提供者,那么相应的就需要消费者去消费暴露出来的接口,nacos-consumer的创建步骤与nacos-provider类似。

5.1、引入依赖



    com.alibaba.cloud
    spring-cloud-starter-alibaba-nacos-discovery

5.2、配置 yml 文件

server:
  port: 9002
spring:
  application:
    name: nacos-consumer
  cloud:
    nacos:
      discovery:
        # nacos的服务地址
        server-addr: 127.0.0.1:8848
management:
  endpoints:
    web:
      exposure:
        ## yml文件中存在特殊字符,必须用单引号包含,否则启动报错
        include: '*'
#调用的微服务名称,这里指服务提供者
service-url:
  nacos-provider: http://nacos-provider

5.3、开启服务发现
同样在启动类添加@EnableDiscoveryClient开启服务发现:

@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApplication {

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

5.4、编写测试接口
在 Spring Cloud Nacos 2021 以后就没有在默认使用 Ribbon 作为负载均衡器了,而且在Cloud官网中也推荐使用LoadBalancer 作为负载均衡器,对此先引入依赖:

引入 LoadBalancer依赖:



org.springframework.cloud
spring-cloud-starter-loadbalancer
 

创建RestTemplate,如下:

@Configuration
public class RestTemplateConfig {

/**
 * 注入 RestTemplate
 * 
 * @return
 */
@Bean
public RestTemplate restTemplate(){
    return new RestTemplate();
}
``
编写接口调用 nacos-provider服务暴露出来的接口:
``
@RestController
@RequestMapping("/nacos")
public class NacosController {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @Value("${service-url.nacos-provider}")
    private String serviceUrl;

    @GetMapping("/getMessage")
    public String test(){
        //使用 LoadBalanceClient 和 RestTemplate 结合的方式来访问
        ServiceInstance serviceInstance = loadBalancerClient.choose(serviceUrl);
        //调用 nacos-provider 的接口
        String url = String.format("http://%s:%s/nacos/test",serviceInstance.getHost(),serviceInstance.getPort());
        return restTemplate.getForObject(url,String.class);
    }
}

5.5、启动项目
启动 nacos-consumer服务,可以看得到服务提供者与服务消费者都已经注册进来:
SpringBoot + Spring Cloud Alibaba + Nacos实现服务管理_第4张图片
接下来要做的事情是调用 nacos-consumer的接口,输入地址:

http://localhost:9002/nacos/getMessage:

在这里插入图片描述

成功调用 nacos-provider接口。

6、Nacos Config 服务配置中心

6.1、引入依赖

Nacos 不只有服务注册与发现的功能,还拥有配置管理的功能, 下面是配置管理的参数列表及代表的含义:

配置项 Key 默认值 说明
服务端地址 spring.cloud.nacos.config.server-addr Nacos Server 启动监听的ip地址和端口
配置对应的 DataId spring.cloud.nacos.config.name 先取 prefix,再取 name,最后取 spring.application.name
配置对应的 DataId spring.cloud.nacos.config.prefix 先取 prefix,再取 name,最后取 spring.application.name
配置内容编码 spring.cloud.nacos.config.encode 读取的配置内容对应的编码
GROUP spring.cloud.nacos.config.group DEFAULT_GROUP 配置对应的组
文件扩展名 spring.cloud.nacos.config.fileExtension properties 配置项对应的文件扩展名,目前支持 properties 和 yaml(yml)
获取配置超时时间 spring.cloud.nacos.config.timeout 3000 客户端获取配置的超时时间(毫秒)
接入点 spring.cloud.nacos.config.endpoint 地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址
命名空间 spring.cloud.nacos.config.namespace 常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等
AccessKey spring.cloud.nacos.config.accessKey 当要上阿里云时,阿里云上面的一个云账号名
SecretKey spring.cloud.nacos.config.secretKey 当要上阿里云时,阿里云上面的一个云账号密码
Nacos Server 对应的 context path spring.cloud.nacos.config.contextPath Nacos Server 对外暴露的 context path
集群 spring.cloud.nacos.config.clusterName 配置成Nacos集群名称
共享配置 spring.cloud.nacos.config.sharedDataids 共享配置的 DataId, “,” 分割
共享配置动态刷新 spring.cloud.nacos.config.refreshableDataids 共享配置中需要动态刷新的 DataId, “,” 分割
自定义 Data Id 配置 spring.cloud.nacos.config.extConfig 属性是个集合,内部由 Config POJO 组成。Config 有 3 个属性,分别是 dataId, group 以及 refresh

同上面的步骤类似,这里首先要做的一步是引入依赖, 使用 group ID 为 com.alibaba.cloud 和 artifact ID 为 spring-cloud-starter-alibaba-nacos-config 的 starter:


    com.alibaba.cloud
    spring-cloud-starter-alibaba-nacos-config

从 SpringCloud 2020 版本开始bootstrap 文件便失效了,需要手动导入相应的依赖:



    org.springframework.cloud
    spring-cloud-starter-bootstrap

bootstrap.properties/yml文件优先级高于 application.properties/yml。

6.2、配置 yml 文件
在 bootstrap.yml添加以下配置:

server:
  port: 9003
  
spring:
  application:
    name: nacos-config
    # 当前环境,这个和dataId有关-> ${prefix}-${spring.profiles.active}.${file-extension}
  profiles:
    active: dev
  cloud:
    nacos:
      config:
        # nacos的地址,作为配置中心
        server-addr: 127.0.0.1:8848
        ## 配置内容的数据格式,目前只支持 properties 和 yaml 类型,这个和dataId有关-> ${prefix}-${spring.profiles.active}.${file-extension}
        file-extension: properties
management:
  endpoints:
    web:
      exposure:
        # yml文件中存在特殊字符,必须用单引号包含,否则启动报错
        include: '*'

6.3、dataId 的含义
dataId 是一个配置的唯一标识,格式如下:

${prefix}-${spring.profiles.active}.${file-extension}

prefix:前缀,默认是spring.cloud.nacos.config.prefix的值,再是 spring.cloud.nacos.config.name的值, 最后是 spring.application.name的值。
spring.profiles.active: 即为当前环境对应的 profile。当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 p r e f i x . {prefix}. prefix.{file-extension}。
file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。
6.4、Nacos 添加配置
在 Nacos 中 添加一个 user.age配置,如下图:
SpringBoot + Spring Cloud Alibaba + Nacos实现服务管理_第5张图片

填写完后点击发布保存配置,如下图:
SpringBoot + Spring Cloud Alibaba + Nacos实现服务管理_第6张图片

6.5、获取 Nacos 配置
新建一个 entity 用于接收配置:

@Component
public class ConfigUser {

    @Value("${user.age}")
    private Integer age;

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

新建一个 controller, 用于测试:

@RestController
@RequestMapping("/config")
public class NacosConfigController {

    @Autowired
    private ConfigUser configUser;

    @GetMapping("/test")
    public String test() {
        return "current user age is:" + configUser.getAge();
    }
}

启动项目,访问 http://localhost:9003/config/test 接口,成功读取到配置信息:
在这里插入图片描述
6.6、动态刷新配置
我们肯定不想每次配置完都重启项目,想要实现动态刷新需要添加注解@RefreshScope,将注解标注在对应的类上,如下:

@Component
@RefreshScope
public class ConfigUser {

    @Value("${user.age}")
    private Integer age;

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

重启项目完毕,修改 Nacos 中的 user.age=20,然后访问接口:
在这里插入图片描述

执行结果
在这里插入图片描述
发现配置自动更新了。6.7、多环境隔离(NameSpace)
正常的业务开发分为以下三个环境:
···
dev:本地开发环境
test:测试环境
prod:生产环境
···
虽然 dataId能够唯一的区分每一个配置文件,但是当微服务配置多了,很难查找每个环境的配置,因此有了 NameSpace即命名空间来隔离每个环境的配置。

我们创建了以下三个命名空间:
SpringBoot + Spring Cloud Alibaba + Nacos实现服务管理_第7张图片

注意:上图中的命名空间ID是系统自动生成的唯一 ID,后续指定不同的Namespace 就用这个 ID。

Nacos 默认的命名空间是 public, 在 test命名空间添加 user.age=30的配置,如下图:

SpringBoot + Spring Cloud Alibaba + Nacos实现服务管理_第8张图片
bootstrap.yml 修改配置如下:

spring:
  application:
    name: nacos-config
    # 当前环境,这个和dataId有关-> ${prefix}-${spring.profiles.active}.${file-extension}
  profiles:
    active: test
  cloud:
    nacos:
      config:
        # nacos的地址,作为配置中心
        server-addr: 127.0.0.1:8848
        # 配置内容的数据格式,目前只支持 properties 和 yaml 类型,这个和dataId有关-> ${prefix}-${spring.profiles.active}.${file-extension}
        file-extension: properties
        # 命名空间ID
        namespace: f633bb70-eb73-4944-b752-ad8f03881181

配置完毕,重启项目访问 http://localhost:9003/config/test 接口,如下:
SpringBoot + Spring Cloud Alibaba + Nacos实现服务管理_第9张图片
成功读取配置。

6.8、不同业务隔离(Group)
不同的微服务可能有着不同的配置,例如商品系统与订单系统通过分库分别访问不同的数据库,意味着有不同的数据库配置,此时就需要根据Group即组进行配置的区分,
例如Goods_Group、Order_Group, 默认的是 DEFAULT_GROUP。

在 nacos添加配置user.age=40,命名空间为test, 分组为Goods_Group:
SpringBoot + Spring Cloud Alibaba + Nacos实现服务管理_第10张图片
在 bootstrap.yml指定分组,配置如下:

spring:
  application:
    name: nacos-config
    # 当前环境,这个和dataId有关-> ${prefix}-${spring.profiles.active}.${file-extension}
  profiles:
    active: test
  cloud:
    nacos:
      config:
        # nacos的地址,作为配置中心
        server-addr: 127.0.0.1:8848
        # 配置内容的数据格式,目前只支持 properties 和 yaml 类型,这个和dataId有关-> ${prefix}-${spring.profiles.active}.${file-extension}
        file-extension: properties
        # 指定命名空间ID
        namespace: f633bb70-eb73-4944-b752-ad8f03881181
        # 指定分组
        group: Goods_Group

重启项目后再次访问 http://localhost:9003/config/test 接口,如下:
在这里插入图片描述
读取配置成功。

6.9、共享配置
当微服务数量增多,一般会有相同的配置,那如何把相同的配置提取出来实现共享呢?

在 Nacos添加 share-config1.properties及share-config2-properties配置,如下:
SpringBoot + Spring Cloud Alibaba + Nacos实现服务管理_第11张图片
注意:dataId的后缀一定要为properties或 yml。

share-config1.properties的配置为 user.name=lin
share-config2.properties的配置为 user.age=50
新建module,命名为nacos-config-share,依赖同nacos-config一样。

bootstrap.yml配置如下:

server:
  port: 9004

spring:
  application:
    name: nacos-config-share
  cloud:
    nacos:
      config:
        # nacos的地址,作为配置中心
        server-addr: 127.0.0.1:8848
        ## 共享配置,List集合,可以配置多个
        shared-configs:
          ## dataId:配置文件的dataId,必须带有后缀
          - dataId: share-config1.properties
            ## refresh:指定是否能够动态刷新,默认是false
            refresh: true
          - dataId: share-config2.properties
            ## 指定配置文件的分组,默认是DEFAULT_GROUP
            group: Goods_Group
management:
  endpoints:
    web:
      exposure:
        # yml文件中存在特殊字符,必须用单引号包含,否则启动报错
        include: '*'

可以看到:

通过 spring.cloud.nacos.config.shared-configs[n].data-id 来支持多个共享 Data Id 的配置。
通过 spring.cloud.nacos.config.shared-configs[n].group 来配置自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP。
通过 spring.cloud.nacos.config.shared-configs[n].refresh 来控制该Data Id在配置变更时,是否支持应用中动态刷新,默认false。
新建 entity,用于接收共享配置,如下:

@Component
@RefreshScope
public class ConfigUser {

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

    @Value("${user.age}")
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

新建controller,用于接收共享配置,如下:

@RestController
@RequestMapping("/config")
public class NacosConfigShareController {

    @Autowired
    private ConfigUser configUser;

    @GetMapping("/test")
    public String test() {
        return "current user name is:" + configUser.getName() + " , and age is:" + configUser.getAge();
    }
}

启动项目,访问 http://localhost:9004/config/test, 如下:
SpringBoot + Spring Cloud Alibaba + Nacos实现服务管理_第12张图片
成功访问到 share-config1.properties及 share-config2.properties的共享配置。

到这里 Nacos的基本用法介绍完毕,了解更多详细信息参考官方Nacos config文档。

参考文档:

https://github.com/alibaba/spring-cloud-alibaba/wiki/
https://juejin.cn/post/6990146025545531405#heading-31
https://developer.aliyun.com/article/1082538

你可能感兴趣的:(spring,boot,后端,java)