DeepEXI 脚手架集成 Consul
consul 是一个用Go语言编写的可以自动化网络配置,服务发现并连接云容器的软件
为什么选择 Consul ?
✅服务发现 | ✅储存数据元空间 | ✅集成Kubernetes | ✅健康检查 | ✅动态负载均衡
安装 generator-deepexi-spring-cloud相关依赖
安装 yeoman
$ npm install -g yo
安装 generator-deepexi-spring-cloud
$ npm install -g generator-deepexi-spring-cloud
下载 Consul 到本地并启动 Consul:
1 | docker pull consul:latest |
下载脚手架代码
1 | mkdir {your folder} |
调试模式启动脚手架
1 | npm link |
即可将本地项目代替 npm module 中对应的包
利用脚手架创建生产者项目
1 | mkdir consul-producer |
根据交互任务调度类型选择 consul,生成 demo 选择 y.
修改applicaition.yml
spring.application.name 是consul首页上显示的service name,为了便于识别修改为spring-cloud-consul-producer
由于consul的健康检查实际上依赖的是actuator,所以还要配置actuator。脚手架默认引入了actuator的依赖及配置, 所以我们只需设置其服务端口即可
1
2
3
4
5
6
7
8
9spring:
application:
name: spring-cloud-consul-producer
server:
port: 8086
management:
server:
port: 8083
- 修改applicaition-local.yml
- 注意的是,如果想要management-port生效,服务需和consul处于同一集群下
1
2
3
4
5
6
7
8spring:
cloud:
consul:
discovery:
register-health-check: true
register: true
enabled: true
management-port: 8083
- 注意的是,如果想要management-port生效,服务需和consul处于同一集群下
属性名 | 说明 |
---|---|
register-health-check | 注册健康检查 |
register | 注册为consul服务 |
enabled | 是否启用服务发现 |
management-port | 端口注册管理服务(即为actuator端口) |
新增代码清单:
用于给生产者调用的接口1
2
3
4
5
6
7
8
9
public class ProducerController {
"/hello") (
public String hello() {
return "hello consul from producer";
}
}利用脚手架创建消费者项目
1
2
3mkdir consul-consumer
$ cd consul-consumer
$ yo deepexi-spring-cloud
根据交互任务调度类型选择 consul,生成 demo 选择 y.
修改applicaition.yml
1
2
3
4
5
6
7
8
9spring:
application:
name: spring-cloud-consul-consumer
server:
port: 8080
management:
server:
port: 8081修改applicaition-local.yml
1
2
3
4
5
6
7
8spring:
cloud:
consul:
discovery:
register-health-check: true
register: true
enabled: true
management-port: 8081新增代码清单:
远程调用生产者接口的接口1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class ConsumerController {
private LoadBalancerClient loadBalancer;
public RestTemplate restTemplate() {
return new RestTemplate();
}
private RestTemplate restTemplate;
"/call") (
public String call() {
ServiceInstance serviceInstance = loadBalancer.choose("spring-cloud-consul-producer");
System.out.println("Hostname:" + serviceInstance.getUri());
System.out.println("service name:" + serviceInstance.getServiceId());
String serviceResult1 =
new RestTemplate().getForObject(serviceInstance.getUri().toString() + "/hello", String.class);
String serviceResult2 =
restTemplate.getForObject("http://spring-cloud-consul-producer/hello", String.class);
return serviceResult1;
}
}
服务发现相关接口:
1 |
|
运行项目并测试
ok,当走到这一步已经差不多要大功告成了:)
将两个项目启动,并打开 http://localhost:8500/ui
首页出现了绿色的打钩即说明健康检查正常测试远程调用接口
1
curl -X GET "http://localhost:8080/call" -H "accept: */*"
返回以下信息即说明调用链路没有问题
1
2
3
4
5{
"code": "1",
"payload": "{\"code\":\"1\",\"payload\":\"hello consul from producer\",\"success\":true}",
"success": true
}
测试服务发现接口
1
curl -X GET "http://localhost:8080/services" -H "accept: */*"
返回以下信息则说明服务发现成功:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17{
"code": "1",
"payload": [
{
"serviceId": "spring-cloud-consul-producer",
"host": "DESKTOP-J4VTE9I",
"port": 8086,
"secure": false,
"metadata": {
"secure": "false"
},
"uri": "http://DESKTOP-J4VTE9I:8086",
"scheme": null
}
],
"success": true
}