文章目录
- ①. Euraka为什么被废弃
- ②. consul简介、如何下载
- ③. consul功能及下载
- ④. 服务注册与发现 - 8001改造
- ⑤. 服务注册与发现 - 80改造
- ⑥. 服务配置与刷新Refresh
①. Euraka为什么被废弃
- ①. Eureka停更进维
- ②. Eureka对初学者不友好,下图为自我保护机制
- ③. 阿里巴巴Nacos的崛起
②. consul简介、如何下载
-
①. consul官网地址
-
②. Consul 是一套开源的分布式服务发现和配置管理系统,由HashiCorp公司用Go语言开发
提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服务网格,总之Consul提供了一种完整的服务网格解决方案。它具有很多优点。包括: 基于 raft 协议,比较简洁; 支持健康检查, 同时支持 HTTP 和 DNS 协议 支持跨数据中心的 WAN 集群 提供图形界面 跨平台,支持 Linux、Mac、Windows
- ③. HashiCorp是一家非常知名的基础软件提供商,很多人可能没听过它的名字,但是其旗下的6款主流软件,Terraform、Consul、Vagrant、Nomad、Vault,Packer 相信不少程序员都听说或使用过,尤其是Consul使用者不尽其数。截止目前为止,从HashiCorp 官网上的声明来看,开源项目其实还是“安全”的,被禁用的只是Vault企业版(并且原因是Vault产品目前使用的加密算法在中国不符合法规,另一方面是美国出口管制法在涉及加密相关软件上也有相应规定。因此这两项原因使得HashiCorp不得不在声明中说明风险)而非其他所有开源产品(Terraform、Consul等)。因此,大家可以暂时放下心来,放心使用!
③. consul功能及下载
- ①. consul功能
- 服务发现:提供HTTP和DNS两种发现方式。
- 健康监测:支持多种方式,HTTP、TCP、Docker、Shell脚本定制化监控
- KV存储:Key、Value的存储方式
- 多数据中心:Consul支持多数据中心
- 可视化Web界面
-
②. consul下载地址
-
③. consul如何玩?
-
④. 两大作用:服务发现和配置中心
-
⑤. 官网下载
-
⑥. 下载完成后只有一个consul.exe文件,对应全路径下查看版本号信息
-
⑦. 使用开发模式启动 - consul agent -dev
-
⑧. 通过以下地址可以访问Consul的首页:http://localhost:8500
④. 服务注册与发现 - 8001改造
-
①. 支付服务provider8001注册进consul
-
②. POM文件配置来源
<!--SpringCloud consul discovery -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
- ③. yaml文件配置
spring:
####Spring Cloud Consul for Service Discovery
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
- ④. 使用@EnableDiscoveryClient注解开启
@SpringBootApplication
@MapperScan("com.atguigu.cloud.mapper")
@EnableDiscoveryClient
public class Main8001{
public static void main(String[] args){
SpringApplication.run(Main8001.class,args);
}
}
- ⑤. 启动8001并查看consul控制台
⑤. 服务注册与发现 - 80改造
- ①. pom文件
<!--SpringCloud consul discovery -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
- ②. yaml文件
server:
port: 80
spring:
application:
name: cloud-consumer-order
####Spring Cloud Consul for Service Discovery
cloud:
consul:
host: localhost
port: 8500
discovery:
prefer-ip-address: true #优先使用服务ip进行注册
service-name: ${spring.application.name}
- ③. 主启动类 - @EnableDiscoveryClient
@SpringBootApplication
@EnableDiscoveryClient //该注解用于向使用consul为注册中心时注册服务
public class Main80{
public static void main(String[] args){
SpringApplication.run(Main80.class,args);
}
}
- ④. Controller层改造地址为服务地址,进行远程调用8001服务
@RestController
public class OrderController{
//public static final String PaymentSrv_URL = "http://localhost:8001";//先写死,硬编码
public static final String PaymentSrv_URL = "http://cloud-payment-service";//服务注册中心上的微服务名称
@Autowired
private RestTemplate restTemplate;
/**
* 一般情况下,通过浏览器的地址栏输入url,发送的只能是get请求
* 我们模拟消费者发送get请求,but底层调用post方法,客户端消费者参数PayDTO可以不添加@RequestBody
* @param payDTO
* @return
*/
@GetMapping("/consumer/pay/add")
public ResultData addOrder(PayDTO payDTO){
return restTemplate.postForObject(PaymentSrv_URL + "/pay/add",payDTO,ResultData.class);
}
// 删除+修改操作作为家庭作业,O(∩_∩)O。。。。。。。
@GetMapping("/consumer/pay/get/{id}")
public ResultData getPayInfo(@PathVariable Integer id){
return restTemplate.getForObject(PaymentSrv_URL + "/pay/get/"+id, ResultData.class, id);
}
}
- ⑤. 启动80并查看consul控制台
- ⑥. 访问测试地址:http://localhost/consumer/pay/get/10
- ⑦. 配置修改RestTemplateConfig
@Configuration
public class RestTemplateConfig{
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
- ⑧. 三个注册中心异同点
⑥. 服务配置与刷新Refresh
- ①. 服务注册与发现官网
- ②. 修改cloud-provider-payment8001
<!--SpringCloud consul config-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
- ③. yaml配置规则说明
- ④. 新增配置文件bootstrap.yml
spring:
application:
name: cloud-payment-service
####Spring Cloud Consul for Service Discovery
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
config:
profile-separator: '-' # default value is ",",we update '-'
format: YAML
# config/cloud-payment-service/data
# /cloud-payment-service-dev/data
# /cloud-payment-service-prod/data
- ⑤. application.yml
server:
port: 8001
# ==========applicationName + druid-mysql8 driver===================
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/db2024?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
username: root
password: 123456
profiles:
active: dev # 多环境配置加载内容dev/prod,不写就是默认default配置
# ========================mybatis===================
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.xiaozhi.cloud.entities
configuration:
map-underscore-to-camel-case: true
- ⑥. consul服务器key/value配置填写
- 参考规则
- 创建config文件夹,以/结尾
- config文件夹下分别创建其它3个文件夹,以/结尾
- 上述3个文件夹下分别创建data内容,data不再是文件夹
- ⑦. 进行代码测试:http://localhost:8001/pay/get/info
@Value("${server.port}")
private String port;
@GetMapping(value = "/pay/get/info")
private String getInfoByConsul(@Value("${other.info}") String otherInfo){
return "otherInfo: "+otherInfo+"\t"+"port: "+port;
}
- ⑧. 接上一步,我们在consul的dev配置分支修改了内容马上访问,结果无效
- ⑨. 动态刷新案例步骤,修改数据后,可以正常的获取到值
- @RefreshScope主启动类添加
- bootstrap.yml修改下(只为教学实际别改) - spring.cloud.consul.config.watch.wait-time
- ⑩. 截止到这,服务配置和动态刷新全部通过,假设我重启Consul,之前的配置还在吗?