服务注册中心相当于我们例子中说的餐馆管理者,负责服务实例的注册、心跳、简单的负载均衡等功能,同一个服务的不同实例,在注册中心中使用同一个名称。在调用时根据名称找到具体的实例执行具体的任务。如果实例长时间没有心跳,将实例剔除,只保留可用的实例。
类比之前的例子就是,餐馆管理者,管理大家的考勤签到等功能,员工到了要去管理者那里签个到,并且告诉他你是负责什么业务的,比如说负责切菜。他就把你放到切菜的service里。如果需要切菜了,管理者根据简单的轮询规则,依次叫切菜的员工去切菜。如果你长时间没有应答他。他认为你不想干了,把你踢出去。
这样保证了一个服务(切菜)有多个实例同时执行,在高并发的场景下,有很多的服务提供者分担了压力。并且更加稳定,比如其中有的关机了,有的出故障了,不影响服务的正常运行。
服务注册中心本身也是一个服务,它也有罢工的可能性。如果单机部署,也给系统带来了很大的风险,所以一般注册中心也采用集群部署,至少三台。
可以完成服务注册中心功能的插件有Eureka(停更)、Zookepper、Consul、Nacos。Eureka应该是以前最火的,但是停更了,现在应该大多使用Nacos,也很好用。用这两个演示注册中心的使用。
主要分为以下两步:
Eureka 采用 CS(Client/Server,客户端/服务器) 架构,它包括以下两大组件:
默认情况下,Eureka Server同时也是Eureka Client。多个Eureka Server实例,互相之间通过增量复制的方式,来实现服务注册表中数据的同步。Eureka Server默认保证在90秒内,Eureka Server集群内的所有实例中的数据达到一致。从这个架构来看,Eureka Server所有实例所处的角色都是对等的,没有类似Zookeeper、Consul、Etcd等注册中心的选举过程,也不存在主从,所有的节点都是主节点。Eureka官方将Eureka Server集群中的所有实例称为 “对等体”。
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
dependency>
server:
port: 7001
eureka:
instance:
hostname: localhost #eureka服务端的实例名称
client:
#false表示不向注册中心注册自己。
register-with-eureka: false
#false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
fetch-registry: false
service-url:
#设置与Eureka server交互的地址查询服务和注册服务都需要依赖这个地址。
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
@SpringBootApplication
@EnableEurekaServer //关键注解
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
server:
port: 8001
spring:
application:
name: clound-payment-service #注册进服务的service名称
eureka:
client:
#表示是否将自己注册进EurekaServer默认为true。
register-with-eureka: true
#是否从EurekaServer抓取已有的注册信息,默认为true。
#单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetchRegistry: true
service-url:
defaultZone: http://localhost:7001/eureka #EurekaServer地址
@SpringBootApplication
@EnableEurekaClient
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
新建model,端口号7002,主要修改application.yml配置文件,7001,7002互相注册进入对方的服务中。
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://eureka7002.com:7002/eureka/ #相互注册
server:
port: 7002
eureka:
instance:
hostname: eureka7002.com
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://eureka7001.com:7001/eureka/ #相互注册
在7001服务上可以看到7002注册进来,如果还有7003,7004以此类推,服务注册到其他所有服务上。客户端注册到所有服务上
修改8001、8002注册进入集群,修改application.yml配置文件
eureka:
client:
register-with-eureka: true
fetchRegistry: true
service-url:
#defaultZone: http://localhost:7001/eureka 单机版
#集群版
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
Nacos不需要我们自己创建Model写server,直接到官网下载应用即可。
解压缩,进到bin目录下,看到启动脚本如下:
在此目录下执行:
startup.cmd -m standalone
新建Model
idea右键新建
修改pom
新增客户端包,Nacos集成了Ribbon,自带负载均衡算法。
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
server:
port: 80
spring:
application:
name: nacos-consumer-order
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #注册进Nacos
@SpringBootApplication
@EnableDiscoveryClient //开启服务注册与发现功能
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}