ToB企服应用市场:ToB评测及商务社交产业平台

标题: 04-Consul服务注册与发现 [打印本页]

作者: 张裕    时间: 2024-9-28 20:56
标题: 04-Consul服务注册与发现
1.为什么要引入服务注册中心

1.1 缘故原由
  1. public static final String PAYMENT_SRV_URL = "http://localhost:8001";//硬编码
复制代码
微服务地点的IP地点和端口号硬编码到订单微服务中,会存在非常多的题目
(1)如果订单微服务和支付微服务的IP地点大概端口号发生了变化,则支付微服务将变得不可用,需要同步修改订单微服务中调用支付微服务的IP地点和端口号。
(2)如果系统中提供了多个订单微服务和支付微服务,则无法实现微服务的负载平衡功能。
(3)如果系统需要支持更高的并发,需要摆设更多的订单微服务和支付微服务,硬编码订单微服务则后续的维护会变得异常复杂。
所以,在微服务开发的过程中,需要引入服务治理功能,实现微服务之间的动态注册与发现,从现在开始我们正式进入SpringCloud实战。
1.2 注册中心在SpringCloud体系的位置


2.为什么不再利用Eureka

2.1 Enreka停更维护

https://github.com/Netflix/eureka/wiki

2.2 注册中心独立且和微服务功能解耦

目前主流服务中心,盼望单独隔离出来而不是作为一个独立微服务嵌入到系统中。
按照Netflix之前的思绪,注册中心Eureka也是作为一个微服务且需要程序员自己开发摆设(cloud2020的教程,eureka需要单独引入依赖,做为一个服务启动)。
现实情况,盼望微服务和注册中心分离解耦,注册中心和业务无关的,不要混为一谈。提供类似tomcat一样独立的组件,微服务注册上去利用,是个成品。
.3 阿里巴巴Nacos的崛起

一个集成了Service discovery and configuration management的独立组件。在设置文件的长期化上,利用起来比Consul要简单。后面教程会讲解到。
3.Consul简介

3.1 是什么

3.1.1 consul官网地点

https://www.consul.io/
3.1.2 What is Consul?

Consul 是一套开源的分布式服务发现和设置管理系统,由HashiCorp公司用Go语言开发。
提供了微服务系统中的服务治理、设置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独利用,也可以一起利用以构建全方位的服务网格,总之Consul提供了一种完整的服务网格解决方案。它具有许多优点。包括: 基于raft协议,比力简洁; 支持健康检查, 同时支持HTTP和DNS协议支持跨数据中心的 WAN集群,提供图形界面 跨平台,支持 Linux、Mac、Windows。
https://developer.hashicorp.com/consul/docs/intro
3.1.3 禁止利用题目

HashiCorp是一家非常着名的基础软件提供商,许多人大概没听过它的名字,但是其旗下的6款主流软件,Terraform、Consul、Vagrant、Nomad、Vault,Packer 信赖不少程序员都听说或利用过,尤其是Consul利用者不尽其数。截止目前为止,从HashiCorp官网上的声明来看,开源项目其实还是“安全”的,被禁用的只是Vault企业版(并且缘故原由是Vault产品目前利用的加密算法在中国不符合法规,另一方面是美国出口管制法在涉及加密相关软件上也有相应规定。因此这两项缘故原由使得HashiCorp不得不在声明中阐明风险)而非其他全部开源产品(Terraform、Consul等)。因此,大家可以暂时放下心来,放心利用!

3.1.4 Spring Cloud Consul

https://docs.spring.io/spring-cloud-consul/reference/index.html
3.2 醒目嘛

3.2.1 服务发现

提供HTTP和DNS两种发现方式。
3.2.2 健康检测

支持多种方式,HTTP,TCP,Docker,Shell脚本定制化监控。
3.2.3 KV存储

Key,Value的存储方式。
3.2.4 多数据中心

Consul多数据中心
3.2.5 可视化WEB界面

3.3 下载地点

https://developer.hashicorp.com/consul/install
3.4 快速开始

https://docs.spring.io/spring-cloud-consul/reference/quickstart.html

4.下载并运行Consul

下载,注意选择版本,和对应操作系统,以及如果是,Windows下的CPU架构。
找到下载文件,移动到符合的目录,解压即可,因为是一个可执行的consul.exe文件
  1. #查看版本信息,注意在consul.exe目录下执行
  2. D:\Develop\consul>consul -version
复制代码
开发者模式启动
  1. D:\Develop\consul>consul agent -dev
复制代码
通过http://localhost:8500,访问页面
5.服务注册与发现

5.1 服务提供者8001

支付服务provider8001注册进consul
5.1.1 引入依赖
  1. <dependency>
  2.     <groupId>org.springframework.cloud</groupId>
  3.     <artifactId>spring-cloud-starter-consul-discovery</artifactId>
  4.     <exclusions>
  5.         
  6.         <exclusion>
  7.             <groupId>commons-logging</groupId>
  8.             <artifactId>commons-logging</artifactId>
  9.         </exclusion>
  10.     </exclusions>
  11. </dependency>
复制代码
为什么这么引入,见官网
5.1.2 设置文件修改
  1. spring:
  2.   cloud:
  3.     consul:
  4.       host: localhost
  5.       port: 8500
  6.       discovery:
  7.         service-name: ${spring.application.name}
复制代码
5.1.3 主启动

@EnableDiscoveryClient注解,开启服务发现(作为一个服务,注册到consul,也可以从consul中,获取其他服务的ip和端口信息)。
5.2 服务消费者80

5.2.1 引入依赖
  1. <dependency>
  2.     <groupId>org.springframework.cloud</groupId>
  3.     <artifactId>spring-cloud-starter-consul-discovery</artifactId>
  4.     <exclusions>
  5.         
  6.         <exclusion>
  7.             <groupId>commons-logging</groupId>
  8.             <artifactId>commons-logging</artifactId>
  9.         </exclusion>
  10.     </exclusions>
  11. </dependency>
复制代码
5.2.2 修改设置
  1. server:
  2.   port: 8080
  3. spring:
  4.   application:
  5.     name: cloud-consumer-order
  6.   ####Spring Cloud Consul for Service Discovery
  7.   cloud:
  8.     consul:
  9.       host: localhost
  10.       port: 8500
  11.       discovery:
  12.         prefer-ip-address: true #优先使用服务ip进行注册
  13.         service-name: ${spring.application.name}
复制代码
5.2.3 主启动

@EnableDiscoveryClient注解,开启服务发现。
5.2.4 Controller类修改
  1. @RestController
  2. @RequestMapping("/consumer")
  3. public class OrderController {
  4.     //public static final String PAYMENT_SRV_URL = "http://localhost:8001";//硬编码
  5.     public static final String PAYMENT_SRV_URL = "http://cloud-payment-service";//服务注册中心上的微服务名称
  6.     @Resource
  7.     private RestTemplate restTemplate;
  8.        
  9.     ...
  10. }
复制代码
5.2.5 启动测试


5.2.6 修改RestTemplateConfig类
  1. @Configuration
  2. public class RestTemplateConfig {
  3.     @Bean
  4.     @LoadBalanced//新增的,因为注册中心 ,必须要有负载均衡。
  5.     public RestTemplate restTemplate(){
  6.         return new RestTemplate();
  7.     }
  8. }
复制代码
5.3 注册中心异同点

5.3.1 CAP理论

C:Consistency(强一致性)
A:Availablility(可用性)
P:Partition tolerance(分区容错性)
5.3.2 经典CAP图


中心件,一般能支持CAP中的两项特性,就不错了。
5.3.3 AP(Eureka/Nacos)

AP架构
当网络分区出现后,为了保证可用性,系统B可以返回旧值,保证系统的可用性。
当数据出现不一致时,虽然A, B上的注册信息不完全相同,但每个Eureka节点依然能够正常对外提供服务,这会出现查询服务信息时如果请求A查不到,但请求B就能查到。如此保证了可用性但牺牲了一致性结论:违背了一致性C的要求,只满意可用性和分区容错,即AP。

5.3.4 CP(Zookerper/Consul)

CP架构
当网络分区出现后,为了保证一致性,就必须拒接请求,否则无法保证一致性,Consul 遵循CAP原理中的CP原则,保证了强一致性和分区容错性,且利用的是Raft算法,比zookeeper利用的Paxos算法更加简单。虽然保证了强一致性,但是可用性就相应下降了,例如服务注册的时间会稍长一些,因为 Consul 的 raft 协议要求必须过半数的节点都写入乐成才以为注册乐成 ;在leader挂掉了之后,重新选举出leader之前会导致Consul 服务不可用。结论:违背了可用性A的要求,只满意一致性和分区容错,即CP。

6.服务设置与革新

6.1 分布式系统面对的->设置题目

微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每个服务都需要必要的设置信息才能运行,所以一套集中式的、动态的设置管理设施是必不可少的。比如某些设置文件中的内容大部分都是相同的,只有个别的设置项不同。就拿数据库设置来说吧,如果每个微服务利用的技术栈都是相同的,则每个微服务中关于数据库的设置几乎都是相同的,偶然候主机迁移了,我盼望一次修改,处处见效。
当下我们每一个微服务自己带着一个application.yml,上百个设置文件的管理....../(ㄒoㄒ)/~~
6.2 官网阐明

Consul可作为注册中心和设置中心。

作为设置中心先容。

6.3 服务利用设置中心

既然可以利用全局设置信息,直接注册进Consul服务器,从Consul获取。但是要遵守Consul的设置规则要求。
6.3.1 引入依赖
  1. <dependency>
  2.     <groupId>org.springframework.cloud</groupId>
  3.     <artifactId>spring-cloud-starter-consul-config</artifactId>
  4.     <exclusions>
  5.         <exclusion>
  6.             <groupId>commons-logging</groupId>
  7.             <artifactId>commons-logging</artifactId>
  8.         </exclusion>
  9.     </exclusions>
  10. </dependency>
  11. <dependency>
  12.     <groupId>org.springframework.cloud</groupId>
  13.     <artifactId>spring-cloud-starter-bootstrap</artifactId>
  14. </dependency>
复制代码
为什么需要引入注册中心,和bootstrap依赖。见官网

6.3.2 修改设置

Consul设置规则阐明

You can change the data key using spring.cloud.consul.config.data-key.可以利用该属性key修改设置文件和其分组间利用的分隔符。
例如Consul中默认','作为分隔符,application,dev.yml 设置了属性为'-' ,就可以利用该方式,application-dev.yml。
新增bootstrap.yml设置文件
applicaiton.yml是用户级的资源设置项。
bootstrap.yml是系统级的,优先级更加高。
Spring Cloud会创建一个“Bootstrap Context”,作为Spring应用的Application Context的父上下文。初始化的时候,Bootstrap Context负责从外部源加载设置属性并解析设置。这两个上下文共享一个从外部获取的Environment。
Bootstrap属性有高优先级,默认情况下,它们不会被本地设置覆盖。 Bootstrap context和Application Context有着不同的约定,所以新增了一个bootstrap.yml文件,保证Bootstrap Context和Application Context设置的分离。
applicaiton.yml文件改为bootstrap.yml,这是很关键的大概两者共存。因为bootstrap.yml是比applicaiton.yml先加载的。bootstrap.yml优先级高于applicaiton.yml。yml和properties只是文件名后缀,以及设置是,相同前缀的key是否省略不同(写法上),优先级方面无区别。
6.3.3 设置文件内容

bootstrap.yml
  1. spring:
  2.   application:
  3.     name: cloud-payment-service
  4.   cloud:
  5.     consul:
  6.       host: localhost
  7.       port: 8500
  8.       discovery:
  9.         service-name: ${spring.application.name}
  10.       config:
  11.         profile-separator: '-' # default value is ",",we update '-'
  12.         format: YAML
复制代码
applicaiton.yml
  1. server:
  2.   port: 8001
  3. spring:
  4.   datasource:
  5.     type: com.alibaba.druid.pool.DruidDataSource
  6.     driver-class-name: com.mysql.cj.jdbc.Driver
  7.     url: jdbc:mysql://localhost:3307/db2024?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
  8.     username: xxx
  9.     password: xxx
  10.   profiles:
  11.     active:  # 多环境配置加载内容dev/prod,不写就是默认default配置
  12. # ========================mybatis===================
  13. mybatis:
  14.   mapper-locations: classpath:mapper/*.xml
  15.   type-aliases-package: com.atguigu.cloud.entities
  16.   configuration:
  17.     map-underscore-to-camel-case: true
复制代码
6.3.4 consul服务器Key/Value设置填写

1.参考规则
  1. config/cloud-payment-service/data //没写就是默认default
  2. config/cloud-payment-service-dev/data
  3. config/cloud-payment-service-prod/data
复制代码
2.创建config文件夹,以/结尾
打开,consul的web管理界面,Key/value菜单,Create按钮新建即可。
3.在config文件夹下创建其他3个文件夹,以/结尾
4.在上述3个文件夹下分别创建data内容,data不再是文件夹
6.3.5 测试设置中心设置的方法
  1.     @Value("${server.port}")
  2.     private String port;
  3.     @GetMapping(value = "/get/info")
  4.     private String getInfoByConsul(@Value("${info}") String info) {//要和data文件中写入的配置信息相同
  5.         return "Info: " + info + "\t" + "port: " + port;
  6.     }
复制代码
通过修改application.yml里面的激活设置部分,举行内容的验证。
6.3.6 测试


6.3.7 利用ConfigUtil静态获取系统设置的类

一般情况下,开发时,都会利用一个工具类静态的获取系统设置,见博文
6.4 动态革新

在周阳老师视频中,修改了data中的设置内容,不会立即刷洗,但是我学习,操作过程中,会自动革新,且不用设置大概,在主启动类上加@RefreshScope注解。
周洋老师视频中,需要在主启动类,加@RefreshScope注解,修改spring.cloud.consul.config.watch.wait-time设置,改项设置默认值是55秒。
6.5 思考

存在题目,在Key/Value新增的设置,在consul重启后,就没了。Consul的设置长期化...
只是为了记载自己的学习进程,且本人水平有限,不对之处,请指正。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4