代码信息
本篇文章涉及代码版本
组件 | 版本 |
---|---|
Spring Boot | 2.0.8.RELEASE |
Spring Cloud | Finchley.SR1 |
本篇文章涉及应用
应用 | 说明 |
---|---|
base-eureka | 服务发现 |
base-consul-client | 使用consul实现服务发现-客户端 |
base-consul-producer | 使用consul实现服务发现-服务端 |
另外一种服务发现
我们常用的服务发现工具主要有ZooKeeper、etcd、Consul 和 Eureka。之前学习Spring Cloud 多数都是使用的Eureka,但是在Eureka没有后续的支持之后,更多的人开始关注Consul。
启动Consul
因为demo项目还是在window环境下运行,所以这里只简单介绍下window环境下如何启动consul。我下载的是1.5.2版本。
- 首先下载Consul,其下载地址:https://www.consul.io/downloads.html
- 下载后可以得到一个压缩文件,解压后只存在一个consul的文件。
- 这个时候需要使用命令进行启动,启动命令
命令的解释consul agent -dev -ui -node=cloud
命令 | 说明 |
---|---|
-dev | 开发模式启动 |
-ui | 可以用界面进行访问 |
-node | 节点名称 |
截止到目前我们已经启动一个开发用的Consul服务,访问其默认地址http://localhost:8500可以看到已经启动
服务提供者
现在我们开始创建服务的提供者
添加依赖
这里需要注意的一件事情,你引入了consul的相关依赖就不能引入eureka相关依赖了。这里因为demo的项目使用了父类依赖,而我个人把eureka依赖放入父类了,导致不得不去排除这些依赖。实际使用中假如没有这么做的话,前两个依赖排除配置是不需要的
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</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>
</dependencies>
参数配置
不同之处服务连接的配置使用了consul的配置
spring:
application:
name: base-consul-producer
cloud:
# consul 的地址
consul:
host: localhost
port: 8500
server:
port: 8200
logging:
file: ${spring.application.name}.log
# consul agent -dev
启动类的配置
使用了@EnableDiscoveryClient
的注解,其实使用eureka为服务发现的时候也可以使用此注解,只不过个人之前习惯罢了
@EnableDiscoveryClient
@SpringBootApplication
public class ProducerApplication {
public static void main(String[] args) {
SpringApplication.run(ProducerApplication.class, args);
}
}
服务消费者
在依赖、启动类的配置、和参数配置上和服务提供者内容是一致的,所以不再重复
服务调用
这里新建了一个调用服务提供者接口的测试请求。
@RestController
@Log
public class ConsumerController {
@Autowired LoadBalancerClient loadBalancerClient;
@Autowired RestTemplate restTemplate;
@RequestMapping(value = "/consumerGetService",method = RequestMethod.GET)
public String getService() {
// 服务提供者
ServiceInstance serviceInstance = loadBalancerClient.choose("base-consul-producer");
String url = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/getService";
log.info(url);
return restTemplate.postForObject(url,null, String.class);
}
}
测试
首先、启动服务提供者(base-consul-producer)和消费者(extra-consul-client)
我们查看服务发现的信息,已经获取信息了。
现在我们访问extra-consul-client项目中用来测试的consumerGetService
地址,可以看到已经拿到数据了。
到目前为止一个简单的Consul服务发现已经完成
本篇文章并未贴出所有代码,涉及的源码下载地址:https://gitee.com/daifylearn/cloud-learn
ps.上述的所有项目都是可以成功运行的。但是在后期为了实现每个应用端口尽量不冲突会有些许调整,而后续某次作死调整结构和名称可能会导致部分项目无法运行o(╯□╰)o,如果发现请留言我进行修改。