1、consul安装
Consul 不同于 Eureka 需要单独安装,访问Consul 官网下载 Consul 的最新版本,我这里是 consul_1.2.1。
根据不同的系统类型选择不同的安装包,从下图也可以看出 Consul 支持所有主流系统。
我的是windows 64位 我以我的来演示
下载下来是一个 consul_1.2.1_windows_amd64.zip 的压缩包,解压是是一个 consul.exe 的执行文件。
新建文本文档run.txt,添加如下内容(readme内容也是如下,这里我是给自己备份一份而已):
consul agent -dev
pause
将run.txt修改为run.bat
双击run.bat,有如下显示则为启动consul成功
浏览器输入:127.0.0.1:8500 注:8500是consul默认的端口号 有如下页面即为启动consul服务成功
2、两个生产者(两个项目)
springcloud2.0_consul_provider
application.properties
spring.application.name=spring-cloud-consul-producer
server.port=8501
spring.cloud.consul.host=127.0.0.1
spring.cloud.consul.port=8500
#注册到consul的服务名称
spring.cloud.consul.discovery.serviceName=consul-producer
pom.xml
<!-- springCloud 管理依赖 -->
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 监控 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- consul依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</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>
controller
@RestController
public class firstConsulController {
@RequestMapping("/firstConsul")
public String firstConsul() {
return "firstConsul";
}
}
启动类
@SpringBootApplication
@EnableDiscoveryClient
public class AppConsulProvider {
public static void main(String[] args) {
SpringApplication.run(AppConsulProvider.class, args);
}
}
springcloud2.0_consul_provider-2
application.properties
spring.application.name=spring-cloud-consul-producer-2
server.port=8503
spring.cloud.consul.host=127.0.0.1
spring.cloud.consul.port=8500
#注册到consul的服务名称
spring.cloud.consul.discovery.serviceName=consul-producer
pom.xml
<!-- 管理依赖 -->
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<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>
</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>
controller
@RestController
public class firstConsulController {
@RequestMapping("/firstConsul")
public String firstConsul() {
return "firstConsul2";
}
}
启动类
@SpringBootApplication
@EnableDiscoveryClient
public class AppConsulProvider2 {
public static void main(String[] args) {
SpringApplication.run(AppConsulProvider2.class, args);
}
}
3、消费者(一个项目)
application.properties
spring.application.name=spring-cloud-consul-consumer
server.port=8504
spring.cloud.consul.host=127.0.0.1
spring.cloud.consul.port=8500
#设置不需要注册到 consul 中
spring.cloud.consul.discovery.register=false
pom.xml
<!-- springCloud 管理依赖 -->
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<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>
</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>
controller
@RestController
public class ConsulConsumerController {
@Autowired
private LoadBalancerClient loadBalancerClient;
@Autowired
private DiscoveryClient discoveryClient;
/**
* 获取所有服务
* @return
*/
@RequestMapping("/services")
public Object services() {
return discoveryClient.getInstances("consul-producer");
}
/**
* 从所有服务中选择一个服务(轮询)
*/
@RequestMapping("/discover")
public Object discover() {
return loadBalancerClient.choose("consul-producer").getUri().toString();
}
/**
* 使用均衡负载的形式去获取服务端提供的服务
*
*/
@RequestMapping("/call")
public String call() {
ServiceInstance serviceInstance = loadBalancerClient.choose("consul-producer");
System.out.println("服务地址:" + serviceInstance.getUri());
System.out.println("服务名称:" + serviceInstance.getServiceId());
String result = new RestTemplate().getForObject(serviceInstance.getUri().toString() + "/firstConsul", String.class);
System.out.println(result);
return result;
}
}
启动类
@SpringBootApplication
public class AppConsulConsumer {
public static void main(String[] args) {
SpringApplication.run(AppConsulConsumer.class, args);
}
}
访问:
访问:http://127.0.0.1:8504/services 消费者调用services接口查看所有服务
用json转换后为:
访问:http://127.0.0.1:8504/call 多刷新几次发现轮训交替 这也是consul实现负载均衡
访问:http://127.0.0.1:8504/discover 多刷新几次页面 同理访问call
我们已经成功的调用了 Consul 服务端提供的服务,并且实现了均衡负载功能。
整体项目结构