consul是近几年比较流行的服务发现工具,工作中用到,简单了解一下。
consul的三个主要应用场景:服务发现、服务隔离、服务配置。
consul与Eureka的区别
Consul强一致性(CP)
服务注册相比Eureka会稍慢一些。因为Consul的raft协议要求必须过半数的节点都写入成功才认为注册成功
Leader挂掉时,重新选举期间整个consul不可用。保证了强一致性但牺牲了可用性。
Eureka保证高可用和最终一致性(AP)
服务注册相对要快,因为不需要等注册信息replicate到其他节点,也不保证注册信息是否replicate成功
当数据出现不一致时,虽然A, B上的注册信息不完全相同,但每个Eureka节点依然能够正常对外提供服务,这会出现查询服务信息时如果请求A查不到,但请求B就能查到。如此保证了可用性但牺牲了一致性。
示例代码:消费者 (项目 cloud-consumerconsul-order80) 需要下载安装consul具体百度
yml文件:
server:
port: 80
spring:
application:
name: consul-consumer-order
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
config文件:
@Configuration
public class ApplicationContextConfig {
// 配置bean 不然后面没法依赖注入,就像以前ssm整合时配置依赖注入一样,
// 需要在配置文件配置之后,代码中才可以依赖注入
// 当前文件就是spring的配置文件
@Bean
@LoadBalanced //让这个RestTemplate在请求时拥有客户端负载均衡的能力
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
controller文件
@RestController
@RequestMapping("consumer")
public class OrderController {
// zookeeper服务中心的服务名称
public static final String INVOKE_URL = "http://consul-provider-payment";
@Resource
private RestTemplate restTemplate;
@GetMapping(value = "/payment/consul")
public String paymentInfo() {
String result = restTemplate.getForObject(INVOKE_URL + "/payment/consul", String.class);
return result;
}
}
启动类:
@SpringBootApplication
@EnableDiscoveryClient
public class CloudConsumerconsulOrder80Application {
public static void main(String[] args) {
SpringApplication.run(CloudConsumerconsulOrder80Application.class, args);
System.out.println("启动成功");
}
}
提供者项目(cloud-providerconsul-payment8006)需要下载安装consul具体百度
yml文件
server:
port: 8006
spring:
application:
name: consul-provider-payment
cloud:
consul: #需要下载安装consul并启动consul服务,具体百度
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
controller文件
@RestController
//@Slf4j
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@RequestMapping(value = "/payment/consul")
public String paymentConsul() {
return "springcloud with consul: " + serverPort + "\t" + UUID.randomUUID().toString();
}
}
启动类:
@SpringBootApplication
@EnableDiscoveryClient //该注解用于向使用consul或者zookeeper作为注册中心时注册服务
public class CloudProviderconsulPayment8006Application {
public static void main(String[] args) {
SpringApplication.run(CloudProviderconsulPayment8006Application.class, args);
System.out.println("启动成功");
}
}