前言
在平时的业务开发过程中,后端服务与服务之间的调用往往通过fegin或者resttemplate两种方式。但是我们在调用服务的时候往往只需要写服务名就可以做到路由到具体的服务,这其中的原理相比大家都知道是SpringCloud的ribbon组件帮我们做了负载均衡的功能。
灰度的核心就是路由,如果我们能够重写ribbon默认的负载均衡算法是不是就意味着我们能够控制服务的转发呢?是的!
调用链分析
外部调用
请求==>zuul==>服务
zuul在转发请求的时候,也会根据Ribbon从服务实例列表中选择一个对应的服务,然后选择转发.
内部调用
请求==>zuul==>服务Resttemplate调用==>服务
请求==>zuul==>服务Fegin调用==>服务
无论是通过Resttemplate还是Fegin的方式进行服务间的调用,他们都会从Ribbon选择一个服务实例返回.
上面几种调用方式应该涵盖了我们平时调用中的场景,无论是通过哪种方式调用(排除直接ip:port调用),最后都会通过Ribbon,然后返回服务实例.
预备知识
eureka元数据
Eureka的元数据有两种,分别为标准元数据和自定义元数据。
标准元数据:主机名、IP地址、端口号、状态页和健康检查等信息,这些信息都会被发布在服务注册表中,用于服务之间的调用。
自定义元数据:自定义元数据可以使用eureka.instance.metadata-map配置,这些元数据可以在远程客户端中访问,但是一般不会改变客户端的行为,除非客户端知道该元数据的含义
eureka RestFul接口
请求名称
请求方式
HTTP地址
请求描述
注册新服务
POST
/eureka/apps/{appID}
传递JSON或者XML格式参数内容,HTTP code为204时表示成功
取消注册服务
DELETE
/eureka/apps/{appID}/{instanceID}
HTTP code为200时表示成功
发送服务心跳
PUT
/eureka/apps/{appID}/{instanceID}
HTTP code为200时表示成功
查询所有服务
GET
/eureka/apps
HTTP code为200时表示成功,返回XML/JSON数据内容
查询指定appID的服务列表
GET
/eureka/apps/{appID}
HTTP code为200时表示成功,返回XML/JSON数据内容
查询指定appID&instanceID
GET
/eureka/apps/{appID}/{instanceID}
获取指定appID以及InstanceId的服务信息,HTTP code为200时表示成功,返回XML/JSON数据内容
查询指定instanceID服务列表
GET
/eureka/apps/instances/{instanceID}
获取指定instanceID的服务列表,HTTP code为200时表示成功,返回XML/JSON数据内容
变更服务状态
PUT
/eureka/apps/{appID}/{instanceID}/status?value=DOWN
服务上线、服务下线等状态变动,HTTP code为200时表示成功
变更元数据
PUT
/eureka/app