首先我们先介绍Consul,然后介绍Spring Cloud Consul。
Consul是分布式高可用的服务网格(service mesh)解决方案
,提供包括服务发现
、配置
、分段功能
在内的全功能控制平面。
Consul还是一个分布式高可用系统服务发现与配置工具
。与Eureka相近,却有自己的特征:
Consul支持多数据中心(重点)
。更多内容请参考:
Spring Cloud Consul【官网】
提供以服务治理为核心
的多种分布式系统的解决方案。
服务发现
服务可以通过DNS、HTTP直接找到它所依赖的服务。
健康检查
提供健康检查机制,检查服务器返回值到CPU占用率情况等。
K/V存储
应用可根据Consul的Key/Value存储。并且Consul提供HTTP接口来满足用户动态配置、特征标记、协调、leader选举需求
。
多数据中心
Consul原生支持多数据中心。用户不用为了多数据中心自己做抽象。
Consul比较
Consul vs. Other Software【官网】
brew install consul
/usr/local/Cellar/consul/1.3.0
brew services start consul
brew services stop consul
brew services restart consul
Consul提供多种操作机制
运维命令行接口【官网】
研发HTTP API接口【官网】
Spring Cloud Consul通过自动配置对Spring Environment绑定等,为Spring Boot程序提供Consul集成。
简单的使用,可以通过几个注解搞定。
Spring Cloud Consul帮助Spring Cloud引用Consul,并提供良好的支持:
客户端可通过Spring Bean发现服务
。搭建一个简单的例子,介绍Consul的Provider、Consumer、Config功能。
先建立一个服务提供者,并注册到Consul中
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<java.version>1.8java.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-consul-allartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>Finchley.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
<repositories>
<repository>
<id>spring-milestonesid>
<name>Spring Milestonesname>
<url>https://repo.spring.io/libs-milestoneurl>
<snapshots>
<enabled>falseenabled>
snapshots>
repository>
repositories>
主程序
@SpringBootApplication
public class ConsulProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ConsulProviderApplication.class, args);
}
}
Controller
@RestController
public class HelloController {
private static final Log logger = LogFactory.getLog(HelloController.class);
/**
* @description:新版Spring Cloud Consul 默认注册健康检查接口为:/actuator/health
* @version 1.0
* @date: 2019/1/16 下午3:02
* @mofified By:
*/
@GetMapping("/actuator/health")
public String health() {
logger.info("健康检查");
return "SUCCESS";
}
/**
* @description:提供 sayHello 服务:根据对方传来的名字 XX,返回:hello XX
* @version 1.0
* @date: 2019/1/16 下午3:02
* @mofified By:
*/
@GetMapping("/sayHello")
public String sayHello(String name){
logger.info("sayHello被请求了");
return "hello," + name;
}
}
新版Spring Cloud Consul默认注册健康检查接口为:/actuator/health【这个是标准写法】
server:
port: 8081
spring:
application:
name: consul-provider
cloud:
consul:
# consul地址
host: 127.0.0.1
# consul端口
port: 8500
这样,Provider就创建成功了,在Consul启动到情况下,我们启动Provider主程序
...
...
....
2019-01-16 15:41:42.168 INFO 78393 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization completed in 21 ms
2019-01-16 15:41:42.189 INFO 78393 --- [nio-8081-exec-1] c.s.c.p.controller.HelloController : 健康检查
2019-01-16 15:41:52.285 INFO 78393 --- [nio-8081-exec-2] c.s.c.p.controller.HelloController : 健康检查
系统会默认每隔10s进行一次检查
创建一个服务调用者,去消费Provider。
<properties>
<java.version>1.8java.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-consul-discoveryartifactId>
<version>2.0.1.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
<version>2.0.0.RELEASEversion>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
使用Spring Cloud Feign作为服务调用组件
@SpringBootApplication
@EnableFeignClients
public class ConsulAdminApplication {
public static void main(String[] args) {
SpringApplication.run(ConsulAdminApplication.class, args);
}
}
@EnableFeignClients服务调用
@RestController
public class HelloController {
private static final Log logger = LogFactory.getLog(HelloController.class);
@Autowired
private HelloService helloService;
/**
* @description:接收前端传来的参数,调用远程接口,并返回调用结果
* @version 1.0
* @date: 2019/1/16 下午3:13
* @mofified By:
*/
@GetMapping("/hello")
public String hello(String name){
logger.info("输入的参数:" + name);
String returnString = helloService.sayHello(name);
logger.info("响应的结果:" + returnString);
return returnString;
}
/**
* @description:健康检查
* @version 1.0
* @date: 2019/1/16 下午2:53
* @mofified By:
*/
@GetMapping("/actuator/health")
public String health(){
return "SUCCESS";
}
}
使用Feign
@FeignClient("consul-provider")
public interface HelloService {
/**
* 接收信息并返回一句话
* @param name
* @return
*/
@RequestMapping(value = "/sayHello", method = RequestMethod.GET)
String sayHello(@RequestParam("name") String name);
}
spring:
application:
name: consul-admin
cloud:
consul:
host: 127.0.0.1
port: 8500
discovery:
healthCheckPath: /
healthCheckInterval: 5s
server:
port: 8082
session-timeout: 10
tomcat:
max-threads: 0
uri-encoding: UTF-8
启动调用者
服务调用者调用了提供者的服务,provider和consumer就演示完了
项目代码(cloud-csl-admin)
主要实现通过Consul管理后台实现动态配置,无需重启程序即可修改配置。创建一个项目cloud-csl-config
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<java.version>1.8java.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-consul-allartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>Finchley.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
@SpringBootApplication
@RefreshScope
public class ConsulConfigApplication {
public static void main(String[] args) {
SpringApplication.run(ConsulConfigApplication.class, args);
}
}
@RestController
public class ConsulConfigController {
private static final Log logger = LogFactory.getLog(ConsulConfigController.class);
/**
* 读取远程配置
*/
@Value("${foo.bar.name}")
private String name;
/**
* @description:将配置展示在页面
* @version 1.0
* @date: 2019/1/16 下午3:27
* @mofified By:
*/
@GetMapping("/getName")
public String getName(){
return name;
}
}
这里使用了@Value("${foo.bar.name}")注解,获取foo.bar.name
spring:
application:
name: consul-config
cloud:
consul:
host: 127.0.0.1
port: 8500
server:
port: 8083
yml只配置这些,没有foo.bar.name,我们通过Consul管理界面的Key/Value配置
项目代码(cloud-csl-config)
这样,consul的服务发布及注册以及动态配置已经演示过了,下面我们再进一步的了解consul。
由于篇幅过长,将扩展阅读 Spring Cloud Consul(点击打开) 集群放到下章讲解。