依赖包如下:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>spring-boot-starter-actuator 健康检查依赖于此包。
spring-cloud-starter-consul-discovery Spring Cloud Consul 的支持。
Spring Boot 版本使用的是 2.0.3.RELEASE,Spring Cloud 最新版本是 Finchley.RELEASE 依赖于 Spring Boot 2.x.
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>完整的 pom.xml 文件大家可以参考示例源码。
配置文件配置文件内容如下
spring.application.name=spring-cloud-consul-producer server.port=8501 spring.cloud.consul.host=localhost spring.cloud.consul.port=8500 #注册到consul的服务名称 spring.cloud.consul.discovery.serviceName=service-producerConsul 的地址和端口号默认是 localhost:8500 ,如果不是这个地址可以自行配置。
spring.cloud.consul.discovery.serviceName 是指注册到 Consul 的服务名称,后期客户端会根据这个名称来进行服务调用。
添加了 @EnableDiscoveryClient 注解表示支持服务发现。
提供服务我们在创建一个 Controller,推文提供 hello 的服务。
@RestController public class HelloController { @RequestMapping("/hello") public String hello() { return "helle consul"; } }为了模拟注册均衡负载复制一份上面的项目重命名为 spring-cloud-consul-producer-2 ,修改对应的端口为 8502,修改 hello 方法的返回值为:"helle consul two",修改完成后依次启动两个项目。
这时候我们再次在浏览器访问地址::8500,显示如下:
我们发现页面多了 service-producer 服务,点击进去后页面显示有两个服务提供者:
这样服务提供者就准备好了。
Consul 消费端我们创建一个 spring-cloud-consul-consumer 项目,pom 文件和上面示例保持一致。
配置文件配置文件内容如下
spring.application.name=spring-cloud-consul-consumer server.port=8503 spring.cloud.consul.host=127.0.0.1 spring.cloud.consul.port=8500 #设置不需要注册到 consul 中 spring.cloud.consul.discovery.register=false客户端可以设置注册到 Consul 中,也可以不注册到 Consul 注册中心中,根据我们的业务来选择,只需要在使用服务时通过 Consul 对外提供的接口获取服务信息即可。
启动类 @SpringBootApplication public class ConsulConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsulConsumerApplication.class, args); } } 进行测试我们先来创建一个 ServiceController ,试试如果去获取 Consul 中的服务。
@RestController public class ServiceController { @Autowired private LoadBalancerClient loadBalancer; @Autowired private DiscoveryClient discoveryClient; /** * 获取所有服务 */ @RequestMapping("/services") public Object services() { return discoveryClient.getInstances("service-producer"); } /** * 从所有服务中选择一个服务(轮询) */ @RequestMapping("/discover") public Object discover() { return loadBalancer.choose("service-producer").getUri().toString(); } }