1、服务注册与发现
1.1、consul
1.1.1 是什么
官网: Consul by HashiCorp
spring-cloud-consul: Spring Cloud Consul :: Spring Cloud Consul
gitHub 官网 :GitHub - hashicorp/consul: Consul is a distributed, highly available, and data center aware solution to connect and configure applications across dynamic, distributed infrastructure.
1.1.2 能干什么
1.1.3 怎么用
1.1.3.1 官网下载地址
安装网页:Install Consul | Consul | HashiCorp Developer
windows版本:
下载链接:Install | Consul | HashiCorp Developer
windows版本只有一个exe文件,进入对应的文件夹,通过cmd命令,在cmd命令面板中心开发模式运行:consul agent -dev
访问:http://localhost:8500
1.1.4、discovery
1.1.4.1 服务提供者
1.1.4.1.1 引入maven依赖
参考链接:Quick Start :: Spring Cloud Consul
<!--SpringCloud consul discovery -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
1.1.4.1.2 yml 配置
参考链接: Service Discovery with Consul :: Spring Cloud Consul
####Spring Cloud Consul for Service Discovery
spring:
cloud:
consul:
discovery:
instance-id: custom-service-id
serviceName: myprefix-${spring.application.name}
1.1.4.1.3 修改启动类
@EnableDiscoveryClient
public class Main8001
{
public static void main(String[] args)
{
SpringApplication.run(Main8001.class,args);
}
}
consul 发现结果:
1.1.4.2 服务消费者
1.1.4.2.1 引入maven 依赖
<!--SpringCloud consul discovery -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
1.1.4.2.2 yml 配置
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}
1.1.4.2.3 修改启动类
@SpringBootApplication
@EnableDiscoveryClient //该注解用于向使用consul为注册中心时注册服务
public class Main80
{
public static void main(String[] args)
{
SpringApplication.run(Main80.class,args);
}
}
1.1.4.2.4 修改服务提供者链接
@RestController
public class OrderController
{
//硬编码
//public static final String PaymentSrv_URL = "http://localhost:8001";
//服务注册中心上的微服务名称
public static final String PaymentSrv_URL = "http://cloud-payment-service";
}
1.1.4.2.5 修改RestTemplateConfig
@Configuration
public class RestTemplateConfig
{
//添加负载均衡 LoadBalanced
@Bean
@LoadBalanced
public RestTemplate restTemplate()
{
return new RestTemplate();
}
}
结果:
1.2、nacos
1.2.1 是什么
官网:Nacos官网| Nacos 配置中心 | Nacos 下载| Nacos 官方社区 | Nacos 官网
gitHub 官网:GitHub - alibaba/nacos: an easy-to-use dynamic service discovery, configuration and service management platform for building cloud native applications.
1.2.2 能干什么
Nacos 提供了四大功能:
- 服务发现和服务健康检查
- 动态配置管理
- 动态域名解析服务
- 服务和元数据管理
1.2.3 怎么用
1.2.3.1 官网下载地址
官网安装地址:Nacos 快速开始 | Nacos 官网
windows 启动: 进行对应的bin目录 ,在cmd 下执行 startup.cmd -m standalone
访问:http://localhost:8848/nacos
1.2.4 discovery
1.2.4.1 服务提供者
1.2.4.1.1 改POM
<!--添加 nacos-discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
1.2.4.1.2 改YML
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
service: ${spring.application.name}
1.2.4.1.3 改启动类
@SpringBootApplication
@EnableDiscoveryClient
@MapperScan({"com.hc.cloud.mapper"})
public class Payment {
public static void main(String[] args) {
SpringApplication.run(Payment.class, args);
}
}
1.2.4.1.4 改业务类
@RestController
public class PayAlibabaController
{
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/pay/nacos/{id}")
public String getPayInfo(@PathVariable("id") Integer id)
{
return "nacos registry, serverPort: "+ serverPort+"\t id"+id;
}
}
1.2.4.2 服务消费者
1.2.4.2.1 改POM
<!--nacos-discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--loadbalancer-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
1.2.4.2.2 改YML
service-url:
nacos-user-service: http://payment
1.2.4.2.3 修改启动类
@SpringBootApplication
@EnableDiscoveryClient
public class Main80 {
public static void main(String[] args) {
SpringApplication.run(Main80.class, args);
}
}
1.2.4.2.4 修改RestTemplate
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
1.2.4.2.5 修改业务类
@RestController
public class PaymentController {
@Resource
private RestTemplate restTemplate;
@Value("${service-url.nacos-user-service}")
private String paymentUrl;
@GetMapping("/consumer/consul/payment/get/all")
public ResultData<List<PayVo>> getAllPayments() {
return restTemplate.getForObject(paymentUrl + "/pay/get/all", ResultData.class);
}
}
1.3、zookeeper
1.3.1 是什么
1.3.2 能干什么
-
- 统一命名服务
- 统一配置管理
- 统一集群管理
- 服务器节点动态上下线
- 软负载均衡
1.3.3 怎么用
下载页面地址:Apache ZooKeeper
zookeeper Getting Started Guide : ZooKeeper: Because Coordinating Distributed Systems is a Zoo
1.3.3.1 单机版配置
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
#解决 8080绑定异常
#org.apache.zookeeper.server.admin.AdminServer$AdminServerException: Problem starting AdminServer on address 0.0.0.0, port 8080 and command URL /commands
#Caused by: java.io.IOException: Failed to bind to /0.0.0.0:8080
admin.serverPort=8888
1.3.3.2 集群版配置
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
initLimit=5
syncLimit=2
server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888
admin.serverPort=8888
1.3.4 zookeeper 使用
1.3.4.1 服务器启动
#启动服务器
bin/zkServer.sh start
#客户端连接
bin/zkCli.sh -server 127.0.0.1:2181
1.3.4.2 改pom
<!-- spring-cloud-zookeeper -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--选择对应zookeeper 服务的版本,这里选择的zookeeper版本为3.9.1-->
<!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.9.1</version>
</dependency>
1.3.4.3 改yaml
#对应的服务上,在common上配置不生效
spring:
application:
name: consumer
cloud:
zookeeper:
connect-string: 192.168.10.131:2181
discovery:
enabled: true
root: /services
register: true
service-url:
zk-user-service: http://payment
1.3.4.4 改启动类
//添加 EnableDiscoveryClient
@SpringBootApplication
@EnableDiscoveryClient
public class Main80 {
public static void main(String[] args) {
SpringApplication.run(Main80.class, args);
}
}
1.3.4.5 改config
@Configuration
public class RestTemplateConfig {
//添加LoadBalanced
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
1.3.4.6 改业务类
@RestController
public class PaymentController {
@Resource
private RestTemplate restTemplate;
@Value("${service-url.zk-user-service}")
private String paymentUrl;
@GetMapping("/consumer/consul/payment/get/all")
public ResultData<List<PayVo>> getAllPayments() {
return restTemplate.getForObject(paymentUrl + "/pay/get/all", ResultData.class);
}
}
启动服务即可看到注册结果
请求正常
1.4、euraka
过时
1.5 注册中心比较
Nacos | Eureka | Consul | CoreDNS | ZooKeeper | |
一致性协议 | CP+AP | AP | CP | - | CP |
健康检查 | TCP/HTTP/MYSQL/Client Beat | Client Beat | TCP/HTTP/gRPC/Cmd | - | Keep Alive |
负载均衡策略 | 权重/metadata/Selector | Ribbon | Fabio | RoundRobin | - |
雪崩保护 | 有 | 有 | 无 | 无 | 无 |
自动注销实例 | 支持 | 支持 | 支持 | 不支持 | 支持 |
访问协议 | HTTP/DNS | HTTP | HTTP/DNS | DNS | TCP |
监听支持 | 支持 | 支持 | 支持 | 不支持 | 支持 |
多数据中心 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
跨注册中心同步 | 支持 | 不支持 | 支持 | 不支持 | 不支持 |
Spring Cloud集成 | 支持 | 支持 | 支持 | 不支持 | 支持 |
Dubbo集成 | 支持 | 不支持 | 支持 | 不支持 | 支持 |
Kubernetes集成 | 支持 | 不支持 | 支持 | 支持 | 不支持 |
2、配置中心
2.1 作用
统一集中管理,微服务的配置文件
2.2 各配置中心
2.2.1 consul
2.2.1.1 配置pom
<!--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>
2.2.1.2 配置yml
#在resource 下添加bootstrap.yml
# 配置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
#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.atguigu.cloud.entities
configuration:
map-underscore-to-camel-case: true
2.2.1.3 consul yaml 配置格式
# consul 配置文件格式
# config/cloud-payment-service/data
# /cloud-payment-service-dev/data
# /cloud-payment-service-prod/data
#文件夹时,以/结尾
2.2.2 spring cloud conf
2.2.3 nacos
2.2.3.1 配置POM
<!--bootstrap-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<!--nacos-config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.2.3.2 配置yml
#bootstrap.yml
# nacos配置
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服务注册中心地址
#指定IP地址
ip: 127.0.0.1
config:
server-addr: localhost:8848 #Nacos作为配置中心地址
file-extension: yaml #指定yaml格式的配置
#application.yml
server:
port: 3377
spring:
profiles:
active: dev # 表示开发环境
#active: prod # 表示生产环境
#active: test # 表示测试环境
2.2.3.3 nacos yaml配置格式
# nacos端配置文件DataId的命名规则是:
# ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
# 本案例的DataID是:nacos-config-client-dev.yaml