Eureka服务间调用
Eureka服务间调用
微服务中,很多服务系统都在独立的进程中运行,通过各个服务系统之间的协作来实现一个大项目的所有业务功能
服务系统间 使用多种跨进程的方式进行通信协作,而RESTful风格的网络请求是最为常见的交互方式之一
http
思考:如果让我们写服务调用如何写。
- 硬编码,不合适,ip域名写在代码中,目的:找到服务
- 根据服务名,找相应的ip。目的:这样ip切换或者随便变化,对调用方没有影响。
- Map<服务名,服务列表> map;
- 加上负载均衡。目的:高可用
spring cloud提供的方式
- RestTemplate
- Feign
我个人习惯用RestTemplate,因为自由,方便调用别的第三方的http服务,feign也可以,需要配置。
RESTful
RESTful网络请求是指RESTful风格的网络请求,其中REST是Resource Representational State Transfer的缩写,直接翻译即“资源表现层状态转移”
Resource代表互联网资源
- 所谓“资源”是网络上的一个实体,或者说网上的一个具体信息
- 它可以是一段文本、一首歌曲、一种服务,可以使用一个URI指向它,每种“资源”对应一个URI
Representational是“表现层”意思
- “资源”是一种消息实体,它可以有多种外在的表现形式,我们把“资源”具体呈现出来的形式叫作它的“表现层”
- 比如说文本可以用TXT格式进行表现,也可以使用XML格式、JSON格式和二进制格式
- 视频可以用MP4格式表现,也可以用AVI格式表现
- URI只代表资源的实体,不代表它的形式
- 它的具体表现形式,应该由HTTP请求的头信息Accept和Content-Type字段指定,这两个字段是对“表现层”的描述。
State Transfer是指“状态转移”
- 客户端访问服务的过程中必然涉及数据和状态的转化
- 如果客户端想要操作服务端资源,必须通过某种手段,让服务器端资源发生“状态转移”
- 而这种转化是建立在表现层之上的,所以被称为“表现层状态转移”
- 客户端通过使用HTTP协议中的四个动词来实现上述操作,它们分别是:获取资源的GET、新建或更新资源的POST、更新资源的PUT和删除资源的DELETE
RestTemplate是Spring提供的同步HTTP网络客户端接口
- 它可以简化客户端与HTTP服务器之间的交互,并且它强制使用RESTful风格
- 它会处理HTTP连接和关闭,只需要使用者提供服务器的地址(URL)和模板参数
调用
{
"receivers": [
"13412341234","手机号"
],
"data": [
{
"id": "SMS_144145499",
"templateMap": {
"code": "9876"
}
}
]
}
- 启动eureka(为了方便用单节点:7900)
- 启动service-sms,8002。
- - yapi验证是否启动成功,接口能否访问。
- 验证是否注册到eureka
直接用RestTemplate调用
@Bean public RestTemplate restTemplate() { return new RestTemplate(); } // 正常 ribbon调用 ResponseEntity<ResponseResult> resultEntity = restTemplate.postForEntity(url, smsSendRequest, ResponseResult.class); ResponseResult result = resultEntity.getBody();
启动api-driver。执行:yapi->api-user 手机端获取验证码
feign调用
接口加注解,方法加注解
@FeignClient(name = "service-sms") public interface SmsClient { /** * 按照短信模板发送验证码 * @param smsSendRequest * @return */ @RequestMapping(value="/send/alisms-template", method = RequestMethod.POST) public ResponseResult sendSms(@RequestBody SmsSendRequest smsSendRequest); }
启动api-driver。执行:yapi->api-passenger 发送验证码
Ribbon负载均衡
两种负载均衡
当系统面临大量的用户访问,负载过高的时候,通常会增加服务器数量来进行横向扩展(集群),多个服务器的负载需要均衡
以免出现服务器负载不均衡,部分服务器负载较大,部分服务器负载较小的情况
通过负载均衡,使得集群中服务器的负载保持在稳定高效的状态,从而提高整个系统的处理能力
- 软件负载均衡:nginx,lvs
- 硬件负载均衡:F5
第一层可以用DNS,配置多个A记录,让DNS做第一层分发
第二层用比较流行的是反向代理,核心原理:代理根据一定规则,将http请求转发到服务器集群的单一服务器上
- 软件负载均衡分为:服务端(集中式),客户端。
- 服务端负载均衡:在客户端和服务端中间使用代理,nginx,lvs,keepalived
- 客户端负载均衡:根据自己的情况做负载。Ribbon就是。
客户端负载均衡和服务端负载均衡最大的区别在于
服务端地址列表的存储位置,以及负载算法在哪里
客户端负载均衡
在客户端负载均衡中,所有的客户端节点都有一份自己要访问的服务端地址列表,这些列表统统都是从服务注册中心获取的;
服务端负载均衡
在服务端负载均衡中,客户端节点只知道单一服务代理的地址,服务代理则知道所有服务端的地址。
- Ribbon使用的是客户端负载均衡
- 而在Spring Cloud中我们如果想要使用客户端负载均衡,方法很简单,使用@LoadBalanced注解即可
- 这样客户端在发起请求的时候会根据负载均衡策略从服务端列表中选择一个服务端,向该服务端发起网络请求,从而实现负载均衡
论读书
睁开眼,书在面前 闭上眼,书在心里
睁开眼,书在面前 闭上眼,书在心里