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是SpringCloud体系中,专门用来完成服务的注册和发现的组件
Eureka组件分为2个部分:
当前目前,Eureka已经从2.0开始,不再更新了,但是Spring还是在维护
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
server:
port: 9000
spring:
#必须添加项目名
application:
name: eureka
eureka:
client:
#不需要获得任何其它服务的注册信息
fetch-registry: false
#自身的注册
register-with-eureka: false
service-url:
#地址中的eureka不可以改变
defaultZone: http://localhost:9000/eureka
对项目中的消费者以及生产者进行注册,例如,项目订单、商品等微服务
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
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
@SpringBootApplication
@EnableEurekaClient
public class ProductApplication {
public static void main(String[] args) {
SpringApplication.run(ProductApplication.class,args);
}
}
前提:需要在RestTemplate方法上,添加注解@LoadBalanced
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
开发环境,有时需要去提前做一些微服务的横向扩容测试
横向扩容:我们给每个微服务,提供很多的注册实例
一个微服务程序,被放置在多个Tomcat中,实际上就是横向扩容,横向扩容的目的:
针对同一个微服务程序,模拟多台Tomcat
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
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
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
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
@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的客户端中,每个微服务需要把自己的健康状况传播发送到EurekaServer。让EurekaServer能够清晰的知道每个微服务,目前的健康状态。
http://10.1.1.121:9003/actuator/info就是健康检查的页面,默认没有开启健康检查
官网:https://nacos.io/zh-cn/
http://172.16.4.22:8848/nacos/index.html
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
server:
port: 8080
spring:
application:
name: student-system
cloud:
nacos:
discovery:
server-addr: http://localhost:8848
避坑:如果运行报错Invalid default value for 'gmt_create'
,那么需要将sql语句中的DEFAULT CURRENT_TIMESTAMP
全部删除,创建后的数据库
修改三个nacos实例的端口,并且三个nacos实例连接同一个数据库就可以
添加所有的nacos实例的ip:port
,包括自己的
避坑:此处需要使用本机的ip,不可以使用localhost或127.0.0.1
在各自的bin目录下,使用命令:startup.cmd -m cluster
,进行启动