上一篇我们介绍了使用Eureka搭建高可用集群方案。Eureka 搭建 高可用 订单支付集群
现在市场可以实现服务注册与发现的组件有很多,除了 Eureka(已停止维护) 之外,还有zookeeper,consul,Nacos等诸多组件。
今天介绍一下如何使用Consul做服务注册。
首先去官网下载consol客户端:consol下载地址
什么是Consul?
Consul是HashiCorp公司推出的开源工具,Consul由Go语言开发,部署起来非常容易,只需要极少的可执行程序和配置文件,具有绿色、轻量级的特点。Consul是分布式的、高可用的、 可横向扩展的用于实现分布式系统的服务发现与配置。
Consul具有哪些特点?
- 服务发现(Service Discovery):Consul提供了通过DNS或者HTTP接口的方式来注册服务和发现服务。一些外部的服务通过Consul很容易的找到它所依赖的服务。
- 健康检查(Health Checking):Consul的Client可以提供任意数量的健康检查,既可以与给定的服务相关联(“webserver是否返回200 OK”),也可以与本地节点相关联(“内存利用率是否低于90%”)。操作员可以使用这些信息来监视集群的健康状况,服务发现组件可以使用这些信息将流量从不健康的主机路由出去。
- Key/Value存储:应用程序可以根据自己的需要使用Consul提供的Key/Value存储。 Consul提供了简单易用的HTTP接口,结合其他工具可以实现动态配置、功能标记、领袖选举等等功能。
- 安全服务通信:Consul可以为服务生成和分发TLS证书,以建立相互的TLS连接。意图可用于定义允许哪些服务通信。服务分割可以很容易地进行管理,其目的是可以实时更改的,而不是使用复杂的网络拓扑和静态防火墙规则。
- 多数据中心:Consul支持开箱即用的多数据中心. 这意味着用户不需要担心需要建立额外的抽象层让业务扩展到多个区域。
一,启动consul
consul有别于eureka的是,他是有客户端的,eureka需要我们自己创建一个微服务做客户端。
consul直接下载下来就可以用。
下载并解压consul,可以看到consol是一个.exe文件,打开cmd,使用命令 consul agent -dev
启动
consul默认端口号是8500,启动完成以后,可以在 http://localhost:8500/ui/dc1/services 页面看到如下页面:
这就代表我们启动成功了,并且已经可以往里面注册服务了。
二、服务端 payment
我们还是以客户端order,服务端payment两个模块进行测试。
- 引入consul核心jar包
<!--SpringCloud consul-server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
- 配置文件application.yml:
#端口号
server:
port: 8006
#服务名称
spring:
application:
name: consul-provider-payment
####配置consul注册中心
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
controller:
package com.cpown.springcloud.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* consul服务controller
* create by c-pown on
*/
@RestController
public class ConsulController {
@Value("${server.port}")
private String port;
/**
* 只有一个服务
*/
@RequestMapping("/consul/pay")
public String payservice(){
return "当前服务端口是"+port+",调用服务成功";
}
}
- 主启动类:
package com.cpown.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* 主启动类
* create by c-pown on 2020-09-10
*/
@SpringBootApplication
@EnableDiscoveryClient
public class ConsulPaymentMain {
public static void main(String[] args) {
SpringApplication.run(ConsulPaymentMain.class,args);
}
}
我们的项目很简单,只有一个接口。启动自测一下。
可以看到我们的服务是正常的。并且在consul的监控页面也出现了我们的微服务,代表我们的服务已经注册进了consul。
三、客户端Order
有了服务端我们就可以创建客户端,对我们的服务进行调用。
- 同样要引入
<!--SpringCloud consul-server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
- 配置文件application.yml和我们的payment一样只是端口为80,spring.application.name服务名称不一样。
server:
port: 80
spring:
application:
name: cloud-consumer-order
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
- 这里我们需要建一个配置类,ApplicationConfig.java目的是为了创建RestTemplate的 Bean;
注意:这里要使用@LoadBalanced注解(如果不加的话服务会调用失败),加了会使用默认的轮训负载均衡策略。
package com.cpown.springcloud.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
* 创建RestTemplate Bean
* create by c-pown on
*/
@Configuration
public class ApplicationConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
- 这里我们直接使用
BASY_URL = "http://consul-provider-payment"
微服务名称作为调用地址。
package com.cpown.springcloud.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
/**
* 客户端
* create by c-pown on
*/@RestController
public class ConsumerController {
@Resource
private RestTemplate restTemplate;
/**
* 使用微服务名称进行调用
*/
private static final String BASY_URL = "http://consul-provider-payment";
@RequestMapping("/consumer/pay")
public String order(){
return restTemplate.getForObject(BASY_URL+"/consul/pay",String.class);
}
}
- 主启动类:
package com.cpown.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* create by c-pown on
*/
@SpringBootApplication
@EnableDiscoveryClient
public class ConsulOrderMain {
public static void main(String[] args) {
SpringApplication.run(ConsulOrderMain.class,args);
}
}
现在我们的基本集群架构组件都齐全了,我们启动一下并测试:
启动完毕我们可以看到consul里面多注册了一个cloud-consumer-order
服务。
四、测试
我们使用http://localhost/consumer/pay直接调用接口,是可以成功的。
暂时介绍到这里,下篇文章讲述一下,ribbon负载均衡策略。