前言
在平时的业务开发过程中,后端服务与服务之间的调用往往通过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数据内容 |
查询指定instance |