注册中心以及服务注册 #
- 注册中心:是一个专用于完成微服务的注册,以及服务发现的东西
- 它采用的模式:发布/订阅模式
- 产品:Eureka(国外的),Nacos(国内阿里巴巴),ZooKeeper(动物园管理员)
- 这种产品非常多,具体使用情况具公司的情况具体使用
常用服务注册中心对比 #
| Nacos | Eureka | Consul | CoreDns | Zookeeper | |
|---|---|---|---|---|---|
| 一致性协议 | CP + AP | AP | CP | / | CP |
| 健康检查 | TCP/HTTP/MySQL/client Beat | Client Beat | TCP/HTTP/gRPC/Cmd | / | Client Beat |
| 负载均衡 | 权重/DSL/metaData/CMDB | Ribbon | Fabio | RR | / |
| 雪崩保护 | 支持 | 支持 | 不支持 | 不支持 | 不支持 |
| 自动注销示例 | 支持 | 支持 | 不支持 | 不支持 | 支持 |
| 访问协议 | HTTP/DNS/UDP | HTTP | HTTP/DNS | NNS | TCP |
| 监听支持 | 支持 | 支持 | 支持 | 不支持 | 支持 |
| 多数据中心 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
| 跨注册中心 | 支持 | 不支持 | 支持 | 不支持 | 不支持 |
| Spring Cloud集成 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
| Dubbo集成 | 支持 | 不支持 | 不支持 | 不支持 | 支持 |
| k8s集成 | 支持 | 不支持 | 不支持 | 支持 | 支持 |
Eureka #
-
Eureka是SpringCloud体系中,专门用来完成服务的注册和发现的组件
-
Eureka组件分为2个部分:
- Eureka-Server(注册中心)
- Eureka-client(客户端)
-
当前目前,Eureka已经从2.0开始,不再更新了,但是Spring还是在维护
Eureka-Server搭建 #
1、创建maven项目,导入依赖 #
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2、在该模块的启动类上,添加注解将该应用程序定位为微服务的注册中心 #
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
3、在application.yml中,对eureka进行配置 #
server:
port: 9000
spring:
#必须添加项目名
application:
name: eureka
eureka:
client:
#不需要获得任何其它服务的注册信息
fetch-registry: false
#自身的注册
register-with-eureka: false
service-url:
#地址中的eureka不可以改变
defaultZone: http://localhost:9000/eureka
4、进入eureka界面,证明搭建成功 #
Eureka-client注册服务 #
对项目中的消费者以及生产者进行注册,例如,项目订单、商品等微服务
1、导入依赖(Eureka-Client客户端) #
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2、修改微服务application.yml文件 #
server:
port: 8080
spring:
#必须添加项目名
application:
name: star-product
eureka:
client:
#可以不写,默认值为true
fetch-registry: true
#可以不写,默认值为true
register-with-eureka: true
service-url:
#配置eureka注册地址
defaultZone: http://localhost:9000/eureka
instance:
#将自己的ip注册到eureka的server
prefer-ip-address: true
3、在启动类上, 添加注解,将该程序定义为:Eureka注册中心的客户端 #
@SpringBootApplication
@EnableEurekaClient
public class ProductApplication {
public static void main(String[] args) {
SpringApplication.run(ProductApplication.class,args);
}
}
4、启动该微服务,查看eureka界面是否注册成功 #
5、可以在服务消费方,使用该application名进行访问 #
前提:需要在RestTemplate方法上,添加注解@LoadBalanced
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
横向扩容(提供者高可用) #
-
开发环境,有时需要去提前做一些微服务的横向扩容测试
-
横向扩容:我们给每个微服务,提供很多的注册实例
-
一个微服务程序,被放置在多个Tomcat中,实际上就是横向扩容,横向扩容的目的:
- 提示系统整体的响应性能
- 提升系统整体的可用性(高可用)
-
针对同一个微服务程序,模拟多台Tomcat
实现方式(Idea) #
1、编辑添加实例 #
2、选择springboot实例 #
3、配置实例 #
4、查看eureka,查看实例是否注册成功 #
eureka高可用 #
实现方式(Idea) #
1、修改eureka微服务的配置文件 #
server:
port: 9000
spring:
application:
name: eureka
eureka:
client:
#获得其它服务的注册信息
fetch-registry: true
#进行自身的注册
register-with-eureka: true
service-url:
#需要将自己注册在自身以及其他eureka服务上
defaultZone: http://localhost:9000/eureka,http://localhost:9001/eureka
2、添加新的springboot实例 #
3、启动两个eureka实例,观察 #
4、将其他微服务,注册在所有的eureka上 #
server:
port: 8090
spring:
application:
name: star-orders
eureka:
client:
fetch-registry: true
register-with-eureka: true
service-url:
defaultZone: http://localhost:9000/eureka,http://localhost:9001/eureka
instance:
prefer-ip-address: true
5、观察实例在所有的eureka上都被注册 #
配置actuator #
1、修改微服务在注册中心显示的名称 #
server:
port: 8080
spring:
application:
name: star-product
eureka:
client:
#可以不写,默认值为true
fetch-registry: true
#可以不写,默认值为true
register-with-eureka: true
service-url:
defaultZone: http://localhost:9000/eureka,http://localhost:9001/eureka
instance:
#配置中心显示的名称
instance-id: productName
2、访问路径显示ip地址 #
server:
port: 8080
spring:
application:
name: star-product
eureka:
client:
#可以不写,默认值为true
fetch-registry: true
#可以不写,默认值为true
register-with-eureka: true
service-url:
defaultZone: http://localhost:9000/eureka,http://localhost:9001/eureka
instance:
#配置中心显示的名称
instance-id: productName
#将自己的ip注册到eureka的server
prefer-ip-address: true
服务发现Discovery #
- 对于注册进eureka里面的微服务,可以通过服务发现来获得该服务的信息
- 在主启动类上添加注解:@EnableDiscoveryClient
@EnableDiscoveryClient和@EnableEurekaClient的区别 #
- 相同点
- 都是能够让注册中心能够发现,扫描到该服务
- 不同点
@EnableEurekaClient只适用于Eureka作为注册中心,@EnableDiscoveryClient可以适用与Eureka或其他注册中心
自我保护 #
Eureak默认开起来自我保护。避免因为意外情况,将正常的节点直接删除。
进入自我保护模式最直观的体现就是Eureka Server首页的警告
默认情况下,如果Eureka Server在一定时间内没有接收到某个微服务实例的心跳,Eureka Server将会注销该实例(默认90秒)。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,这就可能变得非常危险了—-因为微服务本身是健康的,此时本不应该注销这个微服务。
自我保护模式是一种对网络异常的安全保护措施。使用自我保护模式,而已让Eureka集群更加的健壮、稳定。
Eureka Server通过“自我保护模式”来解决这个问题—-当Eureka Server节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。一旦进入该模式,Eureka Server就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该Eureka Server节点会自动退出自我保护模式。
在Spring Cloud中,可以使用
eureka.server.enable-self-preservation=false
来禁用自我保护模式,一般不会去主动禁用自我保护
心跳间隔 #
eureka:
instance:
#客户端向服务器发送心跳的时间间隔,单位秒(默认30秒)
lease-renewal-interval-in-seconds: 30
#服务器在最后一次收到客户端心跳的等待时间,单位秒(默认30秒),超时会剔除该客户端
lease-expiration-duration-in-seconds: 90
Eureka的健康检查 #
在eureka的客户端中,每个微服务需要把自己的健康状况传播发送到EurekaServer。让EurekaServer能够清晰的知道每个微服务,目前的健康状态。
http://10.1.1.121:9003/actuator/info就是健康检查的页面,默认没有开启健康检查
Nacos(Alibaba) #
官网:https://nacos.io/zh-cn/
使用 #
1、下载nacos服务端,解压缩 #
2、启动bin下的startup.cmd #
3、启动控制台 #
http://172.16.4.22:8848/nacos/index.html
4、注册提供者和消费者到nacos #
4.1添加依赖 #
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
4.2在启动类添加注解@EnableDiscoveryClient #
4.3修改yml配置文件 #
server:
port: 8080
spring:
application:
name: student-system
cloud:
nacos:
discovery:
server-addr: http://localhost:8848
4.4查看nacos服务端,添加成功 #
Nacos高可用(win下同ip不同端口) #
1、下载nacos,并解压,复制三份 #
2、获取conf文件夹下nacos-mysql.sql脚本,在数据库生成 #
避坑:如果运行报错Invalid default value for 'gmt_create',那么需要将sql语句中的DEFAULT CURRENT_TIMESTAMP全部删除,创建后的数据库
3、分别修改三个nacos实例的配置,conf文件夹下 #
3.1、修改application.properties #
修改三个nacos实例的端口,并且三个nacos实例连接同一个数据库就可以
3.2、重命名cluster.conf.example为cluster.conf,并编辑 #
添加所有的nacos实例的ip:port,包括自己的
避坑:此处需要使用本机的ip,不可以使用localhost或127.0.0.1
4、分别启动三个nacos实例 #
在各自的bin目录下,使用命令:startup.cmd -m cluster,进行启动
5、启动界面,查看效果 #