原文连接linux
Spring Cloud 支持不少服务发现的软件,Eureka 只是其中之一,下面是 Spring Cloud 支持的服务发现软件以及特性对比: git
Consul 不一样于 Eureka 须要单独安装,访问Consul 官网下载 Consul 的最新版本,github
我这里以 Windows 为例,下载下来是一个 consul_1.2.1_windows_amd64.zip 的压缩包,解压是是一个 consul.exe 的执行文件。 web
cd 到对应的目录下,使用 cmd 启动 Consul算法
cd D:\Common Files\consul
#cmd启动:
consul agent -dev # -dev表示开发模式运行,另外还有-server表示服务模式运行
复制代码
为了方便期间,能够在同级目录下建立一个 run.bat 脚原本启动,脚本内容以下spring
consul agent -dev
复制代码
启动结果以下: apache
启动成功以后访问:http://localhost:8500,能够看到 Consul 的管理界面 windows
这样就意味着咱们的 Consul 服务启动成功了。浏览器
把下载的linux下的安装包consul拷贝到linux环境里面,使用unzip进行解压:bash
2,配置环境变量
vi /etc/profile
export JAVA_HOME=/usr/local/jdk1.8.0_172
export MAVEN_HOME=/usr/local/apache-maven-3.5.4
export CONSUL_HOME=/usr/local/consul
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$CONSUL_HOME:$PATH
#上面的CONSUL_HOME就是consul的路径,上面的配置仅供参考。
source /etc/profile #命令使配置生效
#查看安装的consul版本
[root@CentOS124 /]# consul -v
Consul v1.2.2
Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents)
[root@CentOS124 /]#
复制代码
建立一个 spring-cloud-consul-producer 项目 依赖包以下:
<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.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-producer
复制代码
启动类
@SpringBootApplication
@EnableDiscoveryClient
public class ConsulProducerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsulProducerApplication.class, args);
}
}
复制代码
添加了 @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",修改完成后依次启动两个项目。
这时候咱们再次在浏览器访问地址:http://localhost:8500 就会显示出来两个服务提供者
建立一个 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();
}
}
复制代码
Controller 中有俩个方法,一个是获取全部服务名为service-producer的服务信息并返回到页面,一个是随机从服务名为service-producer的服务中获取一个并返回到页面。
添加完 ServiceController 以后咱们启动项目,访问地址:http://localhost:8503/services,返回jsn数据
[{"serviceId":"service-producer","host":"windows10.microdone.cn","port":8501,"secure":false,"metadata":{"secure":"false"},"uri":"http://windows10.microdone.cn:8501","scheme":null},{"serviceId":"service-producer","host":"windows10.microdone.cn","port":8502,"secure":false,"metadata":{"secure":"false"},"uri":"http://windows10.microdone.cn:8502","scheme":null}]
复制代码
发现咱们刚才建立的端口为 8501 和 8502 的两个服务端都存在
屡次访问地址:http://localhost:8503/discover,页面会交替返回信息:
说明 8501 和 8501 的两个服务会交替出现,从而实现了获取服务端地址的均衡负载。
大多数状况下咱们但愿使用均衡负载的形式去获取服务端提供的服务,所以使用第二种方法来模拟调用服务端提供的 hello 方法。
建立 CallHelloController :
@RestController
public class CallHelloController {
@Autowired
private LoadBalancerClient loadBalancer;
@RequestMapping("/call")
public String call() {
ServiceInstance serviceInstance = loadBalancer.choose("service-producer");
System.out.println("服务地址:" + serviceInstance.getUri());
System.out.println("服务名称:" + serviceInstance.getServiceId());
String callServiceResult = new RestTemplate().getForObject(serviceInstance.getUri().toString() + "/hello", String.class);
System.out.println(callServiceResult);
return callServiceResult;
}
}
复制代码
使用 RestTemplate 进行远程调用。添加完以后重启 spring-cloud-consul-consumer 项目。在浏览器中访问地址:http://localhost:8503/call,依次返回结果以下:
helle consul
helle consul two
复制代码
说明咱们已经成功的调用了 Consul 服务端提供的服务,而且实现了服务端的均衡负载功能