Consule
一.Consule简介
1.是什么?
https://www.consul.io/intro/index.html
2.能干嘛?
-
服务发现
-
健康监测
-
KV存储
-
多数据中心
-
可视化Web界面
3.去哪下?
https://www.consul.io/downloads.html
4.怎么玩?
https://www.springcloud.cc/spring-cloud-consul.html
二.安装并运行Consule
1.官网安装说明
https://learn.hashicorp.com/consul/getting-started/install.html
2.下载完成解压之后只有一个consul.exe文件,硬盘路径下双击运行,查看版本信息
3.使用开发模式启动
consul agent -dev
4.测试
http://localhost:8500
三.代码编写
1.生产者
(1) 建module
略
(2) 改pom
<!-- 引入consul依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
(3) 写yml
server:
port: 8006
spring:
application:
name: consul-provider-payment
cloud: #cloud相关配置
consul: #consul相关配置
host: localhost #主机
port: 8500 #端口号
discovery:
service-name: ${spring.application.name} #服务名
(4) 主启动
@EnableDiscoveryClient //服务注册与发现的注解
@SpringBootApplication
//服务注册与发现的注解
@EnableDiscoveryClient
public class PaymentMain8006 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8006.class,args);
}
}
2.消费者
(1) 建module
略
(2) 改pom
同生产者
<!-- 引入consul依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
(3) 写yml
同生产者
server:
port: 80
spring:
application:
name: consul-consumer-order
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
(4) 主启动
同生产者
(5) 业务类
调用方式和zookeeper,eureka一模一样,没啥好说的.
5.1 向spring容器中注入RestTemplate对象
@Configuration
public class ApplicationContextConfig {
/**
* 注入一个rest风格调用主体类
* @return
*/
@Bean
//负载均衡策略,使用集群策略,如果调用的服务,有多个服务提供者,则这个注解不能少,少了就会报错(因为计算机不知道调用哪个具体的服务实例)
//这是ribbon的负责均衡注解,因为eureka已经集成了ribbon,所以就可以直接用此注解
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
5.2 业务代码发起远程调用
@RestController
public class OrderConsulController {
@Autowired
private RestTemplate restTemplate;
//调用的微服务地址
private static final String SERVICE_NAME = "http://cloud-provider-payment";
@GetMapping("/payment/consul")
public String payment(){
String res = restTemplate.getForObject(SERVICE_NAME + "/payment/consul", String.class);
return res;
}
}