服务注册与发现
1. 为什么需要服务注册和发现
当A服务(假设为购物车)远程调用B服务(假设为商品库存)的时候,在为了应对高并发的场景下,我们通常会把B服务复制多份写在多个服务器主机上,已达到分解服务器的压力。
在没有服务注册和发现时
我们需要远程调用的时候,是要把服务器的远程地址,静态写死在代码里的,当一个服务的ip地址因为某种原因改变,或者某个服务器突然挂掉了,那么我们就要在代码中重新修改服务器的ip地址,十分的不灵活。
// 利用RestTemplate发起http请求,得到http的响应, 实现远程调用
ResponseEntity<List<ItemDTO>> response = restTemplate.exchange(
"http://localhost:8081/items?ids={ids}", //这里的服务器地址是写死的
HttpMethod.GET,
null,
new ParameterizedTypeReference<List<ItemDTO>>() {
},
Map.of("ids", CollUtil.join(itemIds, ","))
);
//解析响应,获取响应体
List<ItemDTO> items = response.getBody();
有了服务注册和发现后
有了服务注册和发现后,我们开发者只需要把服务注册技术(框架)引入项目中,就可以实现对服务的管理。在服务启动的时候,这些服务都会自动的注册到服务注册中心,然后当A服务要调用B服务时,A服务就会向服务注册中心“发现”一个B服务,因为B服务,可能有多个IP,所以开发人员可以指定获取B服务的IP的方式(随机,轮训,加权随机......)。当拥有服务B的某台服务器挂掉后,服务注册中心还会有其他的B服务的服务器信息,服务A依旧可以调用服务B且不需要修改代码。注册中心维护了一个可以用的服务列表
2.服务注册与发现的原理(流程)
服务注册
每个服务节点在启动时,都会向注册中心上报自己的服务信息(ip,端口,服务名称等),然后注册中心就会把这些信息保存下来,这就是服务注册
服务发现
当A服务要调用B服务时,就会拿着B服务的名称(product-service)到注册中心,要到拥有B服务的主机的地址信息。这就是服务发现
通常情况下,A服务在拿到B服务的地址信息后,都会备份一份,防止注册中心宕机后,调用失败
当注册中心中的服务信息(如ip 或者端口号等)发送改变时,注册中心就会把更新推送给相关联的服务
心跳机制
为了保证注册中心中的服务都是可用的,每个服务注册在注册中心的服务都会不定时向注册中心发送心跳来证明自己是可用的。当注册中心在检测到该地址的心跳时就会认为该地址是可用的,当检测不到该地址的心跳时,就会认为该地址是不可用的,随后就会把该地址从注册中心中剔除。
3.常见的服务与注册中心
Eureka:Netflix公司出品,目前被集成在SpringCloud当中,一般用于Java应用
Nacos:Alibaba公司出品,目前被集成在SpringCloudAlibaba中,一般用于Java应用
Zookeeper