微服务之注册及配置中心Nacos

B站尚硅谷P95~P110
代码Gitee地址

1. Nacos

一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
注册中心和配置中心的组合。

注册中心区别:
微服务之注册及配置中心Nacos_第1张图片

1.1 安装nacos

  • 直接使用docker安装:

    docker pull nacos/nacos-server:1.1.4
    
    docker run --env MODE=standalone --name nacos -d -p 8848:8848 nacos/nacos-server:1.1.4
    
  • 访问:http://localhost:8848/nacos/index.html,出现如下界面,默认用户名和密码都是nacos
    微服务之注册及配置中心Nacos_第2张图片

1.2 作为服务注册中心

1.2.1 服务提供者

  • 分别新建module:cloudalibaba-provider-payment9001和9002、9003;

  • 依赖:

        <dependencies>
    
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-devtoolsartifactId>
            dependency>
    
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
            dependency>
    
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-webartifactId>
            dependency>
    
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-actuatorartifactId>
            dependency>
    
            <dependency>
                <groupId>org.projectlombokgroupId>
                <artifactId>lombokartifactId>
                <optional>trueoptional>
            dependency>
    
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-testartifactId>
                <scope>testscope>
            dependency>
    
            <dependency>
                <groupId>com.alibabagroupId>
                <artifactId>fastjsonartifactId>
                <version>1.2.62version>
            dependency>
    
        dependencies>
    
  • 配置文件:记得三个提供者端口不同。

    server:
      port: 9001
    
    spring:
      application:
        name: nacos-payment-provider
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848 #配置Nacos地址
    
    #端口暴漏
    management:
      endpoints:
        web:
          exposure:
            include: '*'
    
  • 主启动类:记得不同提供者类名不同。

    @SpringBootApplication
    @EnableDiscoveryClient
    public class NacosMain9001 {
        public static void main(String[] args) {
            SpringApplication.run(NacosMain9001.class,args);
        }
    }
    
  • 业务类:

    @RestController
    @RequestMapping("payment")
    public class PaymentController {
    
        @Value("${server.port}")
        private String serverPort;
    
        @GetMapping(value = "/nacos/{id}")
        public String getPayment(@PathVariable("id") Integer id) {
            return "serverPort: " + serverPort + "\t id:" + id;
        }
    
    }
    
  • 启动三个微服务测试:可以看到三个服务实例
    微服务之注册及配置中心Nacos_第3张图片微服务之注册及配置中心Nacos_第4张图片

1.2.2 服务消费者

  • 新建module:cloudalibaba-consumer-order83;

  • 依赖:

        <dependencies>
    
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
            dependency>
    
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-devtoolsartifactId>
            dependency>
    
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-webartifactId>
            dependency>
    
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-actuatorartifactId>
            dependency>
    
            <dependency>
                <groupId>org.projectlombokgroupId>
                <artifactId>lombokartifactId>
                <optional>trueoptional>
            dependency>
    
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-testartifactId>
                <scope>testscope>
            dependency>
    
        dependencies>
    
  • 配置文件:

    server:
      port: 83
    
    spring:
      application:
        name: nacos-order-consumer
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848
    
    service-url:
      nacos-user-service: http://nacos-payment-provider
    
  • 配置RestTemplate

    @Configuration
    public class ApplicationContextConfig {
        @Bean
        @LoadBalanced
        public RestTemplate getRestTemplate() {
            return new RestTemplate();
        }
    }
    
  • 启动类:

    @EnableDiscoveryClient
    @SpringBootApplication
    public class NacosOrderMain83 {
        public static void main(String[] args) {
            SpringApplication.run(NacosOrderMain83.class, args);
        }
    }
    
  • 业务类:

    @Slf4j
    @RestController
    @RequestMapping("/consumer")
    public class OrderController {
    
        @Resource
        private RestTemplate restTemplate;
    
        @Value("${service-url.nacos-user-service}")
        private String serverURL;
    
        @GetMapping(value = "/payment/nacos/{id}")
        public String paymentInfo(@PathVariable("id") Long id) {
            return restTemplate.getForObject(serverURL + "/payment/nacos/" + id, String.class);
        }
    
    }
    
  • 访问测试:可以看出nacos实现了负载均衡
    微服务之注册及配置中心Nacos_第5张图片

1.2.3 服务中心对比

nacos可以实现ap和cp的切换。

微服务之注册及配置中心Nacos_第6张图片

  • 切换CP/AP方式:ip:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP,必须是put类型请求。

1.3 作为服务配置中心

直接将配置写入nacos中。

1.3.1 项目测试

  • 新建module:cloudalibaba-config-client3377

  • 依赖:

        <dependencies>
    
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
            dependency>
    
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
            dependency>
    
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-webartifactId>
            dependency>
    
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-actuatorartifactId>
            dependency>
    
            <dependency>
                <groupId>org.projectlombokgroupId>
                <artifactId>lombokartifactId>
                <optional>trueoptional>
            dependency>
    
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-testartifactId>
                <scope>testscope>
            dependency>
        dependencies>
    
  • 配置:

    1. bootstrap.yml
      server:
        port: 3377
      
      spring:
        application:
          name: nacos-config-client
        cloud:
          nacos:
            discovery:
              server-addr: localhost:8848 #服务注册中心地址
            config:
              server-addr: localhost:8848 #配置中心地址
              file-extension: yaml #指定yaml格式的配置
      
    2. application.yml
      spring:
        profiles:
          active: dev # 指定环境
      
  • Nacos配置规则,参考如下图中,可以看出我们指定的服务名称+环境+后缀结合后,配置文件(dataId)应该是:nacos-config-client-dev.yaml
    微服务之注册及配置中心Nacos_第7张图片

  • 在nacos界面新增:
    微服务之注册及配置中心Nacos_第8张图片

  • 启动3377测试:可以获取到nacos的配置
    微服务之注册及配置中心Nacos_第9张图片

  • 再次修改配置文件之后,访问接口:可以发现实现了自动更新。微服务之注册及配置中心Nacos_第10张图片

1.3.2 分类配置

1.3.2.1 名命空间

类似于Java的包名和类名,最外层namespeace可以用于区分部署环境,group和dataId逻辑上区分两个目标对象。
微服务之注册及配置中心Nacos_第11张图片

1.3.2.2 dataId

指定spring.profiles.active来配置不同的环境,读取不同的配置文件。

  • 在默认的namespace和默认的group下额外新建一个dataId为nacos-config-client-test.yaml的配置文件。
    微服务之注册及配置中心Nacos_第12张图片

  • 修改本地3377的application.yml:

    spring:
      profiles:
        active: test # 对应当前环境
    
    
  • 访问接口测试:可以看出这里已经读取的是test文件。
    微服务之注册及配置中心Nacos_第13张图片

1.3.2.3 Group
  • 在nacos新建配置文件,并指定不同的组:
    微服务之注册及配置中心Nacos_第14张图片
    微服务之注册及配置中心Nacos_第15张图片

  • 在3377的bootstrap.yml下指定组来获取(默认为默认组):

    server:
      port: 3377
    
    spring:
      application:
        name: nacos-config-client
      cloud:
        nacos:
          discovery:
            server-addr: ip:8848 #服务注册中心地址
          config:
            server-addr: ip:8848 #配置中心地址
            file-extension: yaml #指定yaml格式的配置
            group: TEST_GROUP
    
  • 修改application.yml

    spring:
      profiles:
        active: info # 对应当前环境
    
  • 访问测试:可以看出访问的是指定组的配置文件。
    微服务之注册及配置中心Nacos_第16张图片

1.3.2.4 Namespace
  • 额外新建两个命名空间:
    微服务之注册及配置中心Nacos_第17张图片
    微服务之注册及配置中心Nacos_第18张图片

  • 新建之后,可以发现在配置列表中多了两个空间:
    微服务之注册及配置中心Nacos_第19张图片

  • 在dev命名空间下,新建一个配置文件并且指定组:
    微服务之注册及配置中心Nacos_第20张图片

  • 修改3377的bootstrap.yml

    server:
      port: 3377
    
    spring:
      application:
        name: nacos-config-client
      cloud:
        nacos:
          discovery:
            server-addr: 49.232.141.194:8848 #服务注册中心地址
          config:
            server-addr: 49.232.141.194:8848 #配置中心地址
            file-extension: yaml #指定yaml格式的配置
            namespace: 4a2dfb5f-c3e6-481b-974a-671ddfd39734 # 对应命名空间的编号
            group: TEST_GROUP
    
  • 访问测试:可以读到指定namespace下指定group的指定dataId的配置文件。
    微服务之注册及配置中心Nacos_第21张图片

1.4 集群和持久化配置

省流,这部分出问题了,建议忽略。

这里的vip指的是虚拟ip,即nginx;且官网要求需要对nacos进行持久化,支持的是使用MySQL来实现(默认内部有一个derby数据库,但是多个nacos节点数据存储存在一致性的问题)。
微服务之注册及配置中心Nacos_第22张图片

因此实际上的架构图应该是这样:

微服务之注册及配置中心Nacos_第23张图片

1.4.1 使用MySQL持久化nacos

省流,这里错了。

  • 由于之前使用docker运行nacos容器时,没有指定配置文件等信息,这里重新配置一下。

  • 删除原先的nacos容器:

    # 暂停
    docker stop nacos
    # 删除
    docker rm nacos
    
  • 创建本地挂载目录:

    mkdir -p /home/docker/nacos/conf/
    touch application.properties
    mkdir -p /home/docker/nacos/logs
    
  • 修改:application.properties

    spring.datasource.platform=mysql
     
    db.num=1
    db.url.0=jdbc:mysql://192.168.xx.xx:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&serverTimezone=Asia/Shanghai
    db.user=root
    db.password=123456
    
  • 在数据库中新建nacos库:并执行:sql文件

  • 启动nacos:

    docker run \
    --name nacos -d \
    -p 8848:8848 \
    --privileged=true \
    --restart=always \
    -e JVM_XMS=256m \
    -e JVM_XMX=256m \
    -e MODE=standalone \
    -e PREFER_HOST_MODE=hostname \
    -v /home/docker/nacos/logs:/home/nacos/logs \
    -v /home/docker/nacos/conf/application.properties:/home/nacos/conf/application.properties \
    nacos/nacos-server            
    
  • 可以看到用户存储在了MySQL中
    微服务之注册及配置中心Nacos_第24张图片

  • 增加一个配置测试:找不到错误日志,nacos版本太低了,也可能是MySQL是5.7的原因,暂时搁置。
    微服务之注册及配置中心Nacos_第25张图片

  • 参考地址:使用docker安装nacos并配置mysql8.0

1.4.2 nacos集群

由于无法实现三台虚拟机,鸽了。

你可能感兴趣的