注册中心

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上修改后,重新调用接口,发现配置信息已经自动更新了