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