Consul
Spring Cloud中,大部分组件都有备选访问,如注册中心,除了常见的Eureka外,还有另一个常用的方案就是Consul。Consul是HashiCrop公司推出的开源产品。主要提供:服务发现、服务隔离、服务配置等功能。
相比Eureka和zookeeper,Consul的配置更加简单,其中内置了许多微服务常用的需求:服务发现与注册、分布式一致性协议实现、健康检查、键值对存储、多数据中心等。不需要再安装其他第三方来实现这些功能。
安装
Consul是基于Go语言开发的注册中心,要使用Consul需要现在官网上下载安装软件。
下载压缩包,解压后将consul添加到环境变量,在cmd中输入命令
consul agent -dev
即可开启服务,开启后访问localhost:8500就可以进入consul的后台管理界面
Consul使用
单节点服务注册
创建一个provider服务,添加如下依赖
consul-provider对consul服务进行配置
#服务名称
spring.application.name=consul-provider
#服务端口号
server.port=2000
#注册中心地址
spring.cloud.consul.host=localhost
#consul端口
spring.cloud.consul.port=8500
#consul服务名称
spring.cloud.consul.discovery.service-name=consul-provider
之后在启动类上添加@EnableDiscoveryClient注解,开启服务发现
添加一个简单的测试接口
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(){
return "hello consul";
}
}
启动服务,在consul后台管理界面可以看到服务注册成功
imageconsul集群注册
简单修改测试接口,使接口能返回服务端口号
@RestController
public class HelloController {
@Value("${server.port}")
Integer port;
@GetMapping("/hello")
public String hello(){
return "hello consul>>>"+port;
}
}
修改完成后打包项目,在Terminal启动两个项目实例,分别运行在2000端口和2001端口,再进入consul控制台查看,可以看到两个服务都被注册到了consul上,这两个服务就是一个集群。
服务中心注册信息consul服务消费
项目创建方法和provider服务一样,创建spring boot项目选择Web、Consul Discovery和Spring Boot Actuator三个依赖,并添加相关配置。
注意:避免端口重复
在启动类中开启服务发现,并创建一个RestTemplate的实例
@SpringBootApplication
@EnableDiscoveryClient
public class ConsulConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsulConsumerApplication.class, args);
}
@Bean
RestTemplate restTemplate(){
return new RestTemplate();
}
}
编写测试接口调用服务,注入RestTemplate和LoadBalanceCllent
通过LoadBalanceCllent实例获取要调用的ServiceInstance,获取成功后用
RestTemplate调用
@RestController
public class HelloController {
@Autowired
LoadBalancerClient loadBalancerClient;
@Autowired
RestTemplate restTemplate;
@GetMapping("/hello")
public void hello(){
//获取服务信息
ServiceInstance choose = loadBalancerClient.choose("consul-provider");
System.out.println("服务地址:"+choose.getUri());
System.out.println("服务名称:"+choose.getServiceId());
String s = restTemplate.getForObject(choose.getUri()+"/hello", String.class);
System.out.println(s);
}
}
在consul的后台可以看到consumer服务已经注册到服务中心
服务中心注册信息访问localhost:2002/hello接口可以看到调用服务的相关信息以及服务端方法的调用结果,由于注入了LoadBalanceCllent,所以这个请求自带负载均衡功能。
执行结果