Spring Cloud Consul

文章目录

  • Spring Cloud Consul
    • Consul
      • Consul 简介
        • Consul 作用
      • Consul 安装
        • MAC
      • Consul的支持
    • Spring Cloud Consul
      • Spring Cloud Consul 简介
      • Spring Cloud Consul 作用
      • Spring Cloud Consul 使用
        • 服务提供者(Provider)
        • 服务调用者(Consumer)
        • Consul配置中心(config)
      • 阶段总结

Spring Cloud Consul

首先我们先介绍Consul,然后介绍Spring Cloud Consul。

Consul

Consul 简介

Consul是分布式高可用的服务网格(service mesh)解决方案,提供包括服务发现配置分段功能在内的全功能控制平面。
Consul还是一个分布式高可用系统服务发现与配置工具。与Eureka相近,却有自己的特征:

  • Consul使用Go语言编写,以HTTP方式对外提供服务。
  • Consul支持多数据中心(重点)
  • Consul还有除服务发现以外的功能。
  • Consul的一致性协议是Raft。

更多内容请参考:
Spring Cloud Consul【官网】

Consul 作用

提供以服务治理为核心的多种分布式系统的解决方案。

  • 服务发现
    服务可以通过DNS、HTTP直接找到它所依赖的服务。

  • 健康检查
    提供健康检查机制,检查服务器返回值到CPU占用率情况等。

  • K/V存储
    应用可根据Consul的Key/Value存储。并且Consul提供HTTP接口来满足用户动态配置、特征标记、协调、leader选举需求

  • 多数据中心
    Consul原生支持多数据中心。用户不用为了多数据中心自己做抽象。

  • Consul比较
    Consul vs. Other Software【官网】

Consul 安装

MAC

  • brew 安装
brew install consul
  • 我的下载:
/usr/local/Cellar/consul/1.3.0
  • 启动、关闭、重启
brew services start consul
brew services stop consul
brew services restart consul
  • 启动后访问
    http://localhost:8500

Consul的支持

Consul提供多种操作机制
运维命令行接口【官网】
研发HTTP API接口【官网】

Spring Cloud Consul

Spring Cloud Consul 简介

Spring Cloud Consul通过自动配置对Spring Environment绑定等,为Spring Boot程序提供Consul集成。
简单的使用,可以通过几个注解搞定。

Spring Cloud Consul 作用

Spring Cloud Consul帮助Spring Cloud引用Consul,并提供良好的支持:

  • 服务发现
    实现向Consul注册服务,客户端可通过Spring Bean发现服务
  • 支持Ribbon
    客户端负载
  • 支持Zuul
    服务网关
  • 分布式配置中心
    使用Consul K/V存储
  • 控制总线
    使用Consul events

Spring Cloud Consul 使用

搭建一个简单的例子,介绍Consul的Provider、Consumer、Config功能。

服务提供者(Provider)

先建立一个服务提供者,并注册到Consul中

  • pom.xml
<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>
  • Provider程序

主程序

@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【这个是标准写法】

  • 配置文件(bootstrap.yml)
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进行一次检查

  • consul界面
    Spring Cloud Consul_第1张图片
    项目代码(cloud-csl-provider)

服务调用者(Consumer)

创建一个服务调用者,去消费Provider。

  • pom.xml
<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服务调用

  • Controller
@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";
    }
}
  • service使用Feign
@FeignClient("consul-provider")
public interface HelloService {

    /**
     * 接收信息并返回一句话
     * @param name
     * @return
     */
    @RequestMapping(value = "/sayHello", method = RequestMethod.GET)
    String sayHello(@RequestParam("name") String name);

}
  • application.yml
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

启动调用者

  • consul界面
    Spring Cloud Consul_第2张图片
  • 请求调用者 http://localhost:8082/hello?name=frank
    Spring Cloud Consul_第3张图片

服务调用者调用了提供者的服务,provider和consumer就演示完了
项目代码(cloud-csl-admin)

Consul配置中心(config)

主要实现通过Consul管理后台实现动态配置,无需重启程序即可修改配置。创建一个项目cloud-csl-config

  • pom.xml
<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);
    }
}
  • Controller
@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

  • yml
spring:
  application:
    name: consul-config
  cloud:
    consul:
      host: 127.0.0.1
      port: 8500
server:
  port: 8083

yml只配置这些,没有foo.bar.name,我们通过Consul管理界面的Key/Value配置

  • consul管理界面
    Spring Cloud Consul_第4张图片

Spring Cloud Consul_第5张图片

  • 最后启动config,并访问controller
    Spring Cloud Consul_第6张图片

项目代码(cloud-csl-config)

阶段总结

这样,consul的服务发布及注册以及动态配置已经演示过了,下面我们再进一步的了解consul。


由于篇幅过长,将扩展阅读 Spring Cloud Consul(点击打开) 集群放到下章讲解。

你可能感兴趣的:(微服务,弗兰克与Spring,Framework)