注册中心 Nacos

幻昼 2020年09月16日 217次浏览

注册中心

Spring Cloud出来已经很久了,基本趋于成熟,有多套可用的方案。这里先来看看注册中心。

分类

  1. Nacos

    alibaba套件中的一员,目前很火,中国未来趋势。

  2. Consul

    Spring Cloud 官方推荐注册中心,用来代替Eureka,未来趋势。

  3. Eureka

    已经停止维护,但依旧很多项目使用,官方推荐使用Consul。

接下来重点看看Nacos和Consul。

Nacos

  1. 简介

    Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案,Nacos 作为其核心组件之一,可以作为注册中心和配置中心使用。

    Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

    Nacos 具有如下特性:

    • 服务发现和服务健康监测:支持基于DNS和基于RPC的服务发现,支持对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求;
    • 动态配置服务:动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置;
    • 动态 DNS 服务:动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务;
    • 服务及其元数据管理:支持从微服务平台建设的视角管理数据中心的所有服务及元数据。
  2. 启动
    • 我们先从官网下载Nacos,这里下载的是nacos-server-1.3.2.zip文件,下载地址:https://github.com/alibaba/nacos/releases
    • 配置JAVA_HOME环境变量
    • 解压安装包,cmd切换到bin目录下,./startup.cmd -m standalone
    • 运行成功后,访问 http://localhost:8848/nacos 可以查看Nacos的主页,默认账号密码都是nacos。
  3. 服务提供
    • 创建nacos-provider模块和nacos-consumer模块;

      项目在github都可以找到:https://github.com/xlxsui

    • 如果要使用Spring Cloud Alibaba 的组件都需要在pom.xml中添加如下的配置

      <project>
          // ...
          <dependencyManagement>
              <dependencies>
                  <dependency>
                      <groupId>com.alibaba.cloud</groupId>
                      <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                      <version>2.2.1.RELEASE</version>
                      <type>pom</type>
                      <scope>import</scope>
                  </dependency>
              </dependencies>
          </dependencyManagement>
      </project>
      
    • 修改依赖,注册到Nacos

      <dependency>
          <groupId>com.alibaba.cloud</groupId>
          <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
      </dependency>
      
    • 配置文件

      server:
        port: 20011
      spring:
        application:
          name: nacos-provider
        cloud:
          nacos:
            discovery:
              server-addr: localhost:8848 #配置Nacos地址
      management:
        endpoints:
          web:
            exposure:
              include: '*'
      
      
    • controller创建ProviderController

      @RestController
      @RequestMapping(value = "/provider", produces = "application/json; charset=utf-8")
      public class ProviderController {
      
          @GetMapping("/hi/{name}")
          public String hi(@PathVariable String name) {
              return "微服务返回内容, name: " + name;
          }
      }
      
    • 运行就可以在nacos上看到实例了

  4. 服务消费
    • 使用Feign做负载均衡以及Hystrix服务降级调用服务

    • 创建nacos-provider项目

    • 依赖

      <dependency>
          <groupId>com.alibaba.cloud</groupId>
          <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
      </dependency>
      
      
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-actuator</artifactId>
      </dependency>
      
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-openfeign</artifactId>
          <version>2.2.4.RELEASE</version>
      </dependency>
      
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
          <version>2.2.1.RELEASE</version>
      </dependency>
      
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
          <version>2.2.4.RELEASE</version>
      </dependency>
      
    • 配置

      server:
        port: 20012
      spring:
        application:
          name: nacos-consumer
        cloud:
          nacos:
            discovery:
              server-addr: localhost:8848 #配置Nacos地址
      management:
        endpoints:
          web:
            exposure:
              include: '*'
      
      
    • 项目文件

      在controller目录创建ConsumerController

      @RestController
      @RequestMapping(value = "/consumer", produces = "application/json; charset=utf-8")
      public class ConsumerController {
      
          private static final Logger logger = LoggerFactory.getLogger(ConsumerController.class);
      
          @Autowired
          private ConsumerService consumerService;
      
          @GetMapping("/getHi/{name}")
          public String getHi(@PathVariable String name) {
              logger.info("**************getHi {}", name);
              String msg = consumerService.getHi(name);
              logger.info("*************getHi provider msg: {}", msg);
              return msg;
          }
      }
      
      

      config目录新建Configuration

      @org.springframework.context.annotation.Configuration
      public class Configuration {
      
          @Bean
          public ServletRegistrationBean<HystrixMetricsStreamServlet> getServlet() {
              HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
              ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
              registrationBean.setLoadOnStartup(1);
              registrationBean.addUrlMappings("/hystrix.stream");
              registrationBean.setName("HystrixMetricsStreamServlet");
              return registrationBean;
          }
      
      }
      

      service目录

      新建ConsumerService

      @Service
      public class ConsumerService {
      
          @Autowired
          FeignService feignService;
      
          public String getHi(String name) {
              String msg = feignService.hi(name);
              return msg;
          }
      
      }
      

      service目录下新建feign目录

      创建FeignService FeignServiceFactory FeignServiceFallback

      
      @FeignClient(value = "nacos-provider", fallback = FeignServiceFallback.class)
      public interface FeignService {
      
          @GetMapping("/provider/hi/{name}")
          String hi(@PathVariable String name);
      
      }
      
      @Component
      public class FeignServiceFactory implements FallbackFactory<FeignService> {
          private final FeignServiceFallback feignServiceFallback;
      
          public FeignServiceFactory(FeignServiceFallback feignServiceFallback) {
              this.feignServiceFallback = feignServiceFallback;
          }
      
      
          @Override
          public FeignService create(Throwable throwable) {
              return feignServiceFallback;
          }
      }
      
      
      @Component
      public class FeignServiceFallback implements FeignService {
          @Override
          public String hi(String name) {
              return "fail hi";
          }
      }
      
      
    • 加上注解

      @SpringCloudApplication
      @EnableHystrixDashboard
      @EnableFeignClients
      
    • 运行,调用getHi接口,可以拿到provider的返回。把provider服务关闭,返回熔断信息。

  5. 当作配置中心
    • 创建nacos-config-client模块

    • 依赖

              <dependency>
                  <groupId>com.alibaba.cloud</groupId>
                  <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
              </dependency>
              <dependency>
                  <groupId>com.alibaba.cloud</groupId>
                  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
              </dependency>
      
    • 配置

      application.yml

      spring:
        profiles:
          active: dev
      

      bootstrap.yml

      server:
        port: 20013
      spring:
        application:
          name: nacos-config-client
        cloud:
          nacos:
            discovery:
              server-addr: localhost:8848 #Nacos地址
            config:
              server-addr: localhost:8848 #Nacos地址
              file-extension: yaml #这里我们获取的yaml格式的配置
      
    • controller

      ConfigClientController

      @RestController
      @RefreshScope
      public class ConfigClientController {
      
          @Value("${config.info}")
          private String configInfo;
      
          @GetMapping("/configInfo")
          public String getConfigInfo() {
              return configInfo;
          }
      }
      
    • 在Nacos添加配置

      DataId:nacos-config-client-dev.yaml

      命名格式:

      ${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
      

      配置信息:

      config:
        info: "config info for 开发模式"
      

      image.png

    • 运行调用configInfo接口,成功

      image.png

    • 动态刷新

      在Nacos上修改后,重新调用接口,发现配置信息已经自动更新了