Consul简介
之所以我们要替换掉eureka,因为eureka闭源了,所以使用开源工具去替换它
Consul 是一套开源的分布式服务发现和配置管理系统,由 HashiCorp 公司用 Go 语言开发。下载Consul地址
解压,记住路径,进入cmd命令行,输入命令
consul agent -dev -ui -node=zgq
-dev开发服务器模式启动,
-node结点名为zgq,
-ui可以用界面访问,默认能访问
默认访问http://localhost:8500,看见下面的界面就成功启动了
新建maven项目
新建consul_member项目,添加注解
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
</parent>
<!-- 管理依赖 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.M7</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- SpringBoot整合Web组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--SpringCloud consul-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.40</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
<!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
添加配置文件
###eureka 服务端口号
server:
# member8504
port: 8504
# order8505
#port: 8505
spring:
application:
name: consul-member
#name: consul-member
####consul注册中心地址
cloud:
consul:
host: 127.0.0.1
port: 8500
discovery:
hostname: 127.0.0.1
新建启动类,我就不写了,然后启动,再查看consul服务,注入成功
新建maven项目consul_order,将上面的依赖加入,配置文件的端口号改成8505,启动,就可看见注入成功
查看consul的控制台,即可看见都注入成功
在member中新建UserController
@RestController
@RequestMapping(value = "/user")
public class UserController {
@RequestMapping("/get")
public String getUser() {
return "8504 member controller getuser";
}
}
在order中新建OrderController
@RestController
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
// 获取已经注册的服务
@RequestMapping("/getServices")
public List<String> getServices() {
List<String> services = discoveryClient.getServices();
return services;
}
// 获取服务的集群信息
@RequestMapping("/getServiceUrlList")
public List<String> getServiceUrlList(String name) {
List<ServiceInstance> list = discoveryClient.getInstances(name);
List<String> services = new ArrayList<>();
for (ServiceInstance serviceInstance : list) {
if (serviceInstance != null) {
services.add(serviceInstance.getUri().toString());
}
}
return services;
}
// 调用Member服务
@RequestMapping("/order")
public String order() throws Exception {
// 有两种方式,一种是采用服务别名方式调用,另一种是直接调用 使用别名去注册中心上获取对应的服务调用地址
String serviceUrl = getServiceUrl("consul-member") + "/user/get";
System.out.println(serviceUrl);
String result = (String) restTemplate.getForObject(serviceUrl, String.class);
System.out.println("订单服务调用会员服务result:" + result);
return result;
}
// 取得一个服务地址
protected String getServiceUrl(String name) {
List<ServiceInstance> list = discoveryClient.getInstances(name);
if (list != null && !list.isEmpty()) {
return list.get(0).getUri().toString();
}
return null;
}
当我们调用order层的getServices方法和getServiceUrlList方法时,达到了和eureka相同的效果!