快捷搜索:  汽车  科技

微服务调用怎么解决访问权限问题?关于微服务的RPC远程调用

微服务调用怎么解决访问权限问题?关于微服务的RPC远程调用(3)PUT:用于修改某个资源,若不存在则添加。(2)POST:用于添加新的资源。RESTful风格使用不同的HTTP方法来进行不同的操作,并且使用HTTP状态码来表示不同的结果。例如HTTP的GET方法用来获取资源,HTTP的DELETE方法用来删除资源。在HTTP协议中,大致的请求方法如下:(1)GET:通过请求URI得到资源。

微服务的RPC远程调用

微服务的调用涉及远程接口访问的RPC框架,包括序列化、反序列化、网络框架、连接池、收发线程、超时处理、状态机等重要的基础技术。

通常情况下,Spring Cloud全家桶生态中的RPC框架是通过Feign Hystrix Ribbon组合完成的。具体来说,Feign负责基础的REST调用的序列化和反序列化,Hystrix负责熔断器、熔断和隔离,Ribbon负责客户端负载均衡。

本节先介绍基础的REST接口远程调用,后面再重点介绍Ribbon和Hystrix的使用和原理。

微服务调用怎么解决访问权限问题?关于微服务的RPC远程调用(1)

风格简介

REST(Representational State Transfer)是Roy Fielding提出的一个描述互联系统架构风格的名词。REST定义了一组体系架构原则,可以根据这些原则设计Web服务。

RESTful风格使用不同的HTTP方法来进行不同的操作,并且使用HTTP状态码来表示不同的结果。例如HTTP的GET方法用来获取资源,HTTP的DELETE方法用来删除资源。

在HTTP协议中,大致的请求方法如下:

(1)GET:通过请求URI得到资源。

(2)POST:用于添加新的资源。

(3)PUT:用于修改某个资源,若不存在则添加。

(4)DELETE:删除某个资源。

(5)OPTIONS:询问可以执行哪些方法。

(6)HEAD:类似于GET,但是不返回body信息,用于检查资源是否存在,以及得到资源的元数据。

(7)CONNECT:用于代理传输,如使用SSL。

(8)TRACE:用于远程诊断服务器。在RESTful风格中,资源的CRUD操作包括创建、读取、更新和删除,与HTTP方法之间有一个简单的对应关系:

(1)若要在服务器上创建资源,则应该使用POST方法。

(2)若要在服务器上检索某个资源,则应该使用GET方法。

(3)若要在服务器上更新某个资源,则应该使用PUT方法。

(4)若要在服务器上删除某个资源,则应该使用DELETE方法。

RestTemplate远程调用

Spring Boot提供了一个很好用的REST接口远程调用组件,叫作RestTemplate模板组件。该组件提供了多种便捷访问远程REST服务的方法,能够大大提高客户端的编写效率。比如,可以通过getForEntity()方法发送一个GET请求,该方法的返回值是一个ResponseEntity。ResponseEntity是Spring对HTTP响应的封装,包括几个重要的元素,如响应码、contentType、contentLength、响应消息体等。

Spring Boot自动配置了一个RestTemplateBuilder建造者IOC容器实例来供应用程序自己创建所需的RestTemplate实例。下面是一个小实例:

package com.crazymaker.springcloud.demo.controller; ... @RestController @RequestMapping("/api/call/uaa/") @Api(tags = "演示uaa-provider远程调用") public class UaaCallController { //注入Spring Boot自动配置RestTemplateBuilder建造者IOC容器实例 @Resource private RestTemplateBuilder restTemplateBuilder; @GetMapping("/user/detail/v1") @ApiOperation(value = "RestTemplate远程调用") public RestOut<JSONObject> remoteCallV1() { /** *根据实际的地址调整:UAA服务获取的用户信息地址 */ String url = "http://crazydemo.com:7702/uaa-provider/api/user/detail /v1?userId=1"; /** *使用建造者的build()方法建造restTemplate实例 */ RestTemplate restTemplate = restTemplateBuilder.build(); ResponseEntity<String> responseEntity = restTemplate.getForEntity(url String.class); TypeReference<RestOut<UserDTO>> pojoType = new TypeReference<RestOut<UserDTO>>(){}; /** *用到了阿里FastJson,将远程的响应体转成JSON对象 */ RestOut<UserDTO> result = JsonUtil.jsonToPojo(responseEntity.getBody() pojoType); /** *组装成最终的结果,然后返回客户端 */ JSONObject data = new JSONObject(); data.put("uaa-data" result); return RestOut.success(data).setRespMsg("操作成功"); } }

在代码中,getForEntity()的第一个参数为要调用的Rest服务地址,这里调用了UAA服务提供者提供的用户详细信息接口;

getForEntity()的第二个参数为响应体的封装类型,这里是String。

本质上,RestTemplate实现了对HTTP请求的封装处理,并且形成了一套模板化的调用方法。该组件通过这一套请求调用方法实现各种类型Rest资源的请求处理,比如通过getForEntity()实现GET类型的Rest资源请求处理。

通过浏览器访问以上测试用例所暴露的/user/detail/v1链接,返回的结果如下:

{ "respCode": 0 "respMsg": "操作成功" "datas": { "uaa-data": { "respCode": 0 "respMsg": "操作成功" "datas": { "id": null "userId": 1 "username": "test" "password": "$2a$10$AsCxXPI8B/JDzKK56ZACjuH9Pi2TuT6LLC0Nwh8Qt3a2eFp04gziy" "nickname": "测试用户1" ... } } } } Feign远程调用

Feign是什么?Feign是在RestTemplate基础上封装的,使用注解的方式来声明一组与服务提供者Rest接口所对应的本地Java API接口方法。Feign将远程Rest接口抽象成一个声明式的FeignClient(JavaAPI)客户端,并且负责完成FeignClient客户端和服务提供方的Rest接口绑定。

Feign具备可插拔的注解支持,包括Feign注解和JAX-RS注解。同时,对于Feign自身的一些主要组件,比如编码器和解码器等,也以可插拔的方式提供,在有需求时方便扩张和替换它们。使用Feign的第1步是在项目的pom.xml文件中添加Feign依赖:

<!--添加Feign依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>

使用Feign的第2步是在主函数的类上添加@EnableFeignClient,在客户端启动Feign:

package com.crazymaker.springcloud.user.info.start; ... //启动Feign @EnableFeignClients(basePackages = { "com.crazymaker.springcloud.seckill.remote.client"} defaultConfiguration = {TokenFeignConfiguration.class} ) public class UserCloudApplication { public static void main(String[] args) { SpringApplication.run(UserCloudApplication.class args); } }

使用Feign的第3步是编写声明式接口。这一步将远程服务抽象成一个声明式的FeignClient客户端,示例如下:

package com.crazymaker.springcloud.seckill.remote.client; ... /** *@description:远程服务的本地声明式接口 */ @FeignClient(value = "seckill-provider" path = "/api/demo/") public interface DemoClient { /** *测试远程调用 *@return hello */ @GetMapping("/hello/v1") Result<JSONObject> hello(); /** *非常简单的一个回显接口,主要用于远程调用 *@return echo回显消息 */ @RequestMapping(value = "/echo/{word}/v1" method = RequestMethod.GET) Result<JSONObject> echo( @PathVariable(value = "word") String word); }

在上面接口的@FeignClient注解配置中,使用value指定了需要绑定的服务,使用path指定了接口的URL前缀。然后使用@GetMapping和@RequestMapping两个方法级别的注解分别声明了两个远程调用接口。

使用Feign的第4步是调用声明式接口。这一步非常简单,代码如下:

package com.crazymaker.springcloud.user.info.controller; ... @Api(value = "基础学习DEMO" tags = {"基础学习DEMO"}) @RestController @RequestMapping("/api/demo") public class DemoController { //注入 @FeignClient注解所配置的客户端实例 @Resource DemoClient demoClient; @GetMapping("/say/hello/v1") @ApiOperation(value = "Feign远程调用") public Result<JSONObject> hello() { Result<JSONObject> result = demoClient.hello(); JSONObject data = new JSONObject(); data.put("remote" result); 操作成功 return Result.success(data).setMsg("操作成功"); } }

通过以上4步可以看出,通过Feign进行RPC调用比直接通过RestTemplate简单得多。

本文给大家讲解的内容是微服务的RPC远程调用
  1. 下篇文章给大家讲解的是Feign Ribbon实现客户端负载均衡;
  2. 觉得文章不错的朋友可以转发此文关注小编;
  3. 感谢大家的支持!

猜您喜欢: