SpringCloudConsul之服务发现和配置管理




写在前面

文章参考 Spring-cloud-consul 的官方文档

学习微服务最好使用容器来搭建,对于正在学习编程的小伙伴推荐买上属于自己的一台服务器,用来练练手,也顺带学习 Docker,这很重要。最近,阿里在搞活动,新用户 1C2G 只要 98 一年,我也比较了很多,还是比较划算的,我自己也入手了,可以点进来看看,对了,最便宜的一款在 【全部必抢爆款】 里面: 阿里云服务器,助力云上云!


通过自动配置、绑定到Spring Environment 和 其它的 Spring 编程模型习惯用法,Spring Cloud ConsulSpring Boot 应用程序提供了 consul 集成。通过简单的注释,便可以快速启用和配置应用程序中的公共模式,并使用 Hashicorp 的 consul 来构建大型分布式系统。提供的模式包括 服务发现,分布式配置和控制总线。

Spring Cloud Consul Features:

  • 服务发现:通过Consul 代理注册实例,并且客户端可以使用 Spring 管理的 Bean 发现实例
  • 支持 Ribbon ,客户端负载均衡器
  • 支持 Spring Cloud LoadBalancer - Spring Cloud 项目的客户端负载均衡器
  • 支持 Zuul,动态路由和过滤器
  • 分布式配置:使用 Consul key/value store
  • 控制总线:使用 Consul 事件的分布式控制事件

1. 安装 Consul

下载地址安装说明

下载文件压缩包,解压后,为该二进制程序配置环境变量,执行 consul -v 命令;或者直接在当前文件夹下,打开控制台,执行 consul -v 命令。我们先获得这样的一个可执行程序备用。


2. Consul Agent

Consul Agent 必须对所有的 Spring cloud Consul 应用程序都可用。默认情况下,代理客户端位于 localhost:8500 ,UI 可以从 http://localhost:8500 获得。


consul agent 是 consul 的核心过程,该 agent 维护成员资格信息,注册服务,运行检查,响应查询等等。该 agent 必须在 consul 集群中的每个节点上运行。

任何代理都可以以下两种模式之一运行:客户端或服务器。服务器节点承担成为共识仲裁一部分的额外责任。这些节点参与Raft,并在发生故障的情况下提供强大的一致性和可用性。服务器节点上较高的负担意味着它们通常应在专用实例上运行-它们比客户端节点耗费更多的资源。客户端节点构成了集群的大部分,它们非常轻巧,因为它们与服务器节点进行接口以进行大多数操作,并且很少维护自己的状态。

raft 算法文章推荐,以及一个非常好的动画网站来帮助你理解 raft 算法。


3. consul 服务发现

服务发现是基于微服务的体系结构的关键原则之一。尝试手动配置每个客户端或某种形式的约定,都会非常困难且脆弱。consul 通过 HTTP API 和 DNS 提供服务发现服务。


3.1 入门
  1. 构建服务 consul-server-register

  2. 导入依赖:

    		<dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-consul-discovery</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
  3. 编写启动类

    @SpringBootApplication
    @RestController
    public class Application {
    
        @RequestMapping("/")
        public String home(){
            return "Hello world";
        }
    
        public static void main(String[] args) {
            new SpringApplicationBuilder(Application.class).web(WebApplicationType.SERVLET).run(args);
        }
    }
    

    spring-cloud-starter-consul-discovery 存在服务的类路径时,将自动使用 consul 的服务发现。可以通过 spring.cloud.consul.discovery.enabled = false 或者 spring.cloud.discovery.enabled = false 来禁用 consul 服务发现。使用 spring.cloud.consul.discovery.register = false 来禁用服务注册。

  4. 编写配置文件

    spring:
      application:
        name: consul-server-register
      cloud:
        consul:
          host: localhost
          port: 8500
    server:
      port: 8090
    

    如果使用 Spring Consul Config, 上面的值需要被放在 bootstrap.yml 文件,而不是 application.yml

  5. 以服务器模式启动 consul agent:consul agent -dev

    切勿在生产环境下运行该命令,并且不建议使用单服务器生产部署。应该在生产中运行三到五台服务器(奇数数量)。我们可以打开一个新的命令窗口,通过 consul members 查看。

运行启动类,访问 consul ui 界面:

consul-ui-error

发现有一个服务检测失败了,打开详情页面:

consul-service-error-detail

原来进行检测,需要请求 /actuator/health 端点(我们也可以通过 consul 的命令行窗口看见类似的错误)。所以我们上面的服务需要增加一个依赖项:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

重启服务,问题解决,服务正常。

官方文档提到:“当客户机向 consul注册时,它提供关于自身的元数据,如主机和端口、id、名称和标记。缺省情况下会创建一个HTTP检查,consul每10秒命中/health 端点一次。如果健康检查失败,服务实例将被标记为critical。”

3.2 将 Management 注册为单独的服务

management 服务端口不同于应用程序端口时,management 将被注册为单独的服务:

spring:
  application:
    name: consul-server-register
  cloud:
    consul:
      host: localhost
      port: 8500
server:
  port: 8090
management:
  server:
    port: 8091

修改配置文件为以上内容,重启服务。consul UI 界面会多一个 service。

3.3 服务发现

如果想使用 RestTemplate 访问已经注册的服务, 只需要像这样声明 RestTemplate

@LoadBalanced
@Bean
public RestTemplate loadbalancedRestTemplate() {
   return new RestTemplate();
}

像这样使用它:

	@RequestMapping("/")
    public String home(){
        return loadbalancedRestTemplate().getForEntity("http://consul-server-register/", String.class).getBody();
    }

如果在多个数据中心中有 consul 集群,并且希望访问另一个数据中心中的服务,仅使用服务名称/id是不够的。在这种情况下,您将使用属性 spring.cloud.consul.discovery.datacenters.STORES=dc-west,其中STORES是服务名称/id, dc-west是STORES服务所在的数据中心。


除此之外,我们还可以使用 DiscoveryClient,它为客户端提供了一个简单的 API ,而不是专门针对 Netflix 的。

@Autowired
private DiscoveryClient discoveryClient;

public String serviceUrl() {
    List<ServiceInstance> list = discoveryClient.getInstances("consul-server-register");
    if (list != null && list.size() > 0 ) {
        return list.get(0).getUri().toString();
    }
    return null;
}
// 返回 http://DESKTOP-UH85822:8090

4. consul 分布式配置管理

Consul 提供了 key/value 存储来存储配置和其它元数据。Spring Cloud consul 配置是配置服务器和客户端的替代品。在特殊的“引导”阶段将配置加载到Spring环境中。配置默认存储在/config文件夹中。根据应用程序的名称和活动配置文件创建多个PropertySource实例,这些活动配置文件模仿Spring Cloud配置中解析属性的顺序。例如,一个名为 “testApp” 并带有 “dev” 配置文件的应用程序将创建以下属性源:

config/testApp,dev/
config/testApp/
config/application,dev/
config/application/

最具体的属性源位于顶部,最不具体的属性源位于底部。config/application文件夹中的属性适用于所有使用consul 进行配置的应用程序。config/testApp 文件夹中的属性只对名为“testApp”的服务实例可用。

在应用程序启动时读取配置,向/refresh发送HTTP POST请求将导致重新加载配置。Config Watch 也会自动检测更改并重新加载应用程序上下文。


4.1 入门
  1. 基于之前构建的 consul-server-register 服务。

  2. 新增以下依赖:

    		<dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-consul-config</artifactId>
            </dependency>
    
  3. 编写 bootstrap.yml 配置文件来自定义 consul config:

    spring:
      cloud:
        consul:
          config:
            enabled: true
            prefix: configuration
            defaultContext: consul-server-register
            profileSeparator: '::'
            data-key: config
            format: yaml
            
    
    • enabled 表示是否禁用 consul config
    • prefix 设置配置值的基本文件夹
    • defaultContext: 设置所有应用程序使用的文件夹名
    • profileSeparator: 设置分隔符的值,用于分割属性源配置文件名(profiles)
    • data-key: key 值
    • format: value值的格式
  4. 修改配置中心的 key/value:
    console-keyvalue

  5. 保存以上修改,重新运行 consul-server-register 服务。

服务最终运行在了 8099 端口,并且 management 端口也变为了 8098(覆盖了我们之前在 application.yaml 文件中的配置)。

如果你觉得我的文章对你有所帮助,欢迎关注我的公众号。赞!我与风来
认认真真学习,做思想的产出者,而不是文字的搬运工。错误之处,还望指出!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值