SpringCloud整合Consul注册中心

1 Consul简介

Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案,Consul的方案更“一站式”,内置了服务注册与发现框 架、具有以下性质:

            分布一致性协议实现、
            健康检查、
            Key/Value存储、
            多数据中心方案,
            不再需要依赖其他工具(比如ZooKeeper等)。

2 SpringCloud整合Consul

2.1 创建会员服务

2.1.1 配置会员服务的pom文件

     <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
      </parent>
      <groupId>com.fyzn12</groupId>
      <artifactId>springcloud-consul-member</artifactId>
      <version>1.0-SNAPSHOT</version>
      <packaging>war</packaging>

      <name>springcloud-consul-member Maven Webapp</name>
      <!-- FIXME change it to the project's website -->
      <url>http://www.example.com</url>

      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
      </properties>

      <dependencyManagement>
        <dependencies>
          <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Hoxton.SR2</version>
            <type>pom</type>
            <scope>import</scope>
          </dependency>
        </dependencies>
      </dependencyManagement>
      <dependencies>
        <!-- 导入springboot的启动器-->
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- 导入springcloud整合Zookeeper启动器-->
        <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.12</version>
        </dependency>
      </dependencies>


    这里注意一个bug,在最后会认真分析我在创建该项目过程中遇到的bug  

2.1.2 创建application.yml文件

        server:
          port: 8000
        spring:
          application:
            name: cs-member
          cloud:
            consul:
              host: localhost
              # 注册中心的端口号
              port: 8500
              discovery:
                hostname: 192.168.1.105
        cs-member:
          ribbon:
            listOfServers: http://localhost:8100  

2.1.3 创建访问接口

        /**
         * @author fyzn12
         * @version 1.0
         * @date 2020/7/26 22:16
         * @description:TODO
         */
        @RestController
        public class MemberController {
            @Value("${server.port}")
            private String port;
            @RequestMapping(value = "/getConsulMember")
            public String getConsulMember(){
                return "this is consul member,端口号:"+port;
            }
        }   

2.1.4 创建启动类

        /**
         * @author fyzn12
         * @version 1.0
         * @date 2020/7/26 22:10
         * @description:TODO
         */
        @SpringBootApplication
        @EnableDiscoveryClient
        public class AppConsulMember {
            public static void main(String[] args) {
                SpringApplication.run(AppConsulMember.class,args);
            }
        }  

2.2 创建订单服务

2.2.1 配置会员服务的pom文件

         <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.2.2.RELEASE</version>
          </parent>
          <groupId>com.fyzn12</groupId>
          <artifactId>springcloud-consul-order</artifactId>
          <version>1.0-SNAPSHOT</version>
          <packaging>war</packaging>

          <name>springcloud-consul-order Maven Webapp</name>
          <!-- FIXME change it to the project's website -->
          <url>http://www.example.com</url>

          <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <maven.compiler.source>1.7</maven.compiler.source>
            <maven.compiler.target>1.7</maven.compiler.target>
          </properties>

          <dependencyManagement>
            <dependencies>
              <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR2</version>
                <type>pom</type>
                <scope>import</scope>
              </dependency>
            </dependencies>
          </dependencyManagement>
          <dependencies>
            <!-- 导入springboot的启动器-->
            <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <!-- 导入springcloud整合feign客户端启动器-->
            <dependency>
              <groupId>org.springframework.cloud</groupId>
              <artifactId>spring-cloud-starter-openfeign</artifactId>
            </dependency>
            <!-- 导入springcloud整合Zookeeper启动器-->
            <dependency>
              <groupId>org.springframework.cloud</groupId>
              <artifactId>spring-cloud-starter-consul-discovery</artifactId>
            </dependency>
            <dependency>
              <groupId>junit</groupId>
              <artifactId>junit</artifactId>
              <version>4.12</version>
            </dependency>
            <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
          </dependencies>  

2.2.2 创建订单服务application.yml文件

        server:
          port: 8100
        spring:
          application:
            name: cs-order
          cloud:
            consul:
              host: 127.0.0.1
              port: 8500
              discovery:
                hostname: 192.168.1.105
        cs-member:
          ribbon:
            listOfServers: http://localhost:8100  

2.2.3 创建feign客户端调用接口

        /**
         * @author fyzn12
         * @version 1.0
         * @date 2020/7/26 22:24
         * @description:TODO
         */
        @FeignClient("cs-member")
        public interface ConsulOrderFeign {
            @RequestMapping("/getConsulMember")
            String getConsulMember();
        }    

2.2.4 创建启动类

        /**
         * @author fyzn12
         * @version 1.0
         * @date 2020/7/26 22:24
         * @description:TODO
         */
        @SpringBootApplication
        @EnableDiscoveryClient
        @EnableFeignClients
        public class AppConsulOrder {
            public static void main(String[] args) {
                SpringApplication.run(AppConsulOrder.class,args);
            }

        }  

2.2.5 创建访问接口

        /**
         * @author fyzn12
         * @version 1.0
         * @date 2020/7/26 22:26
         * @description:TODO
         */
        @RestController
        public class ConsulOrderController {
            @Autowired
            private ConsulOrderFeign consulOrderFeign;
            @RequestMapping(value = "/getConsulOrder")
            public String getConsulOrder(){
                return consulOrderFeign.getConsulMember();
            }
        }  

2.3 启动会员服务和订单服务,访问http:localhost:8500查看服务是否注册到consul上

2.4 访问测试

2.5 总结

通过访问订单服务的路径,读取出会员服务的数据,说明使用feign客户端调用成功,整合Consul注册中心成功。


3 在整合过程中遇到的bug与解决方法

3.1 bug出现的错误提示

3.1.1 首先查看consul注册中心提示

如图上面在consul注册中心上面可以看到提示会员服务和订单服务都以注册到上面,但是存在错误接下来点击会员服务查看在注册中心上面的错误提示
如图上面提示可以看出,对于会员服务和订单服务的output可以很明显的看出,对于顶大服务报HTTP GET http://192.168.1.105:8100/actuator/health: 404,造成这个问题的很大一种原因就是没有引入actuator的依赖,导致该路径找不到

3.1.2 访问订单服务查看错误提示

对于错误Load balancer does not have available server for client: cs-member造成的原因有很多如下是可能会造成这个错误的原因部分列举
  1. 在创建feign客户端调用的接口时,@FeignClient内给定的名称与会员服务的别名不相同
  2. 会员服务可能没哟给定别名
对于上面我知道的这两种原因显然都不是,因此引入actuator的依赖
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>  
在会员服务和订单服务上面引入上面的依赖再次查看consul的注册中心发现错误提示消失
访问订单服务的路径正常显示信息,bug解决