SpringBoot服务调用-OpenFeign-H版

SpringBoot服务调用-OpenFeign-H版

服务调用

在之前的教程中我们已经有了 「user」 服务,现在我们有另外一个服务 「shop」 ,如果现在 「shop」 服务需要调用 「user」 服务中的接口查询用户信息,我们该怎么做呢?首先我们知道 「user」 服务提供了下面的http接口,接口定义如下:

@RestController
@RequestMapping("user")
public class UserController {
    @Autowired
    private UserService userService;

    /**
     * 根据用户ID获取用户信息
     * @param id 用户ID
     * @return
     */

    @GetMapping()
    public JsonResponse<UserDto> getUser(@RequestParam("id")Integer id){
        UserDto user = userService.getUser(id);
        return JsonResponse.ok(user);
    }

}

首先你能想到最快的方式就是直接使用HttpClient客户端工具来调用接口,这里为了方便直接使用Spring提供的RestTemplate工具来调用接口,当然你也可以使用其他工具。

try {
            String body = restTemplate.getForObject("http://127.0.0.1:8000/user?id={id}", String.classid);
            ObjectMapper objectMapper = new ObjectMapper();
            JsonResponse<UserDto> jsonResponse = objectMapper.readValue(body, new TypeReference<JsonResponse<UserDto>>() {
            });
            if (!ResponseCode.OK.getCode().equals(jsonResponse.getCode())){
                throw new YsException(String.format("错误的响应码:[%s]",body));
            }
            return JsonResponse.ok(jsonResponse.getData());
        } catch (Exception e) {
            log.error("调用user-server失败!",e);
        }
        return JsonResponse.error("获取用户信息失败",null);

上面可能是你使用RestTemplate来调用接口的方式。首先可以肯定的是这种方式肯定是可以实现我们的任务的。但是这里面存在一些问题:

  • 代码太过于复杂。首先我们需要处理请求参数和响应结果,这部分代码都是类似的写起来很麻烦。
  • 更换客户端需要修改代码。当然我们这里使用的是RestTemplate,它是可以设置底层的HttpClient实现具体实现的。假如我们使用的是Apache HttpClient工具包或者OkHttpClient,我们写的服务调用代码是需要大改的。

当然实际的问题还远不止如此,这里就不一一列举了。有可能你用过Retrofit这个工具,这个工具跟OkHttp是同一家公司的产品。使用Retrofit可以通过Interface的方式调用Http接口,但是这个工具底层的HttpClient工具貌似只支持OkHttp,对于像Apache HttpClient它是不支持的。

OpenFeign

而这里我们要说的OpenFeign它解决了微服务调用存在的问题,该项目是Spring基于Feign开发的一个服务调用组件。Feign它的底层支持常见的HttpClient工具,例如OkHttpClient、Apache HttpClient等,同时它提供了与Retrofit一样支持接口的方式调用Http请求。原生的Feign提供了自己的一套注解,用来支持Http接口的调用。而SpringCloud中支持使用SpringMVC中的注解来调用接口。而想要在SpringCloud中使用OpenFeign步骤也很简单,通过下面几步就能完成:

引入OpenFeign组件

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

创建服务调用接口

@FeignClient(name = "user-server",url = "http://localhost:8000/user")
public interface UserService {
    /**
     * 根据用户ID获取用户信息
     * @param id 用户ID
     * @return
     */

    @GetMapping()
    JsonResponse<UserDto> getUser(@RequestParam("id")Integer id);
}

从上面的代码可以看到,这个接口的定义与 「user」 服务中的接口很相似,只不过它是一个Interface,而没有具体的实现。
重点需要关注的在类上面的 「@FeignClient」 注解,在这个注解中定义了接口请求的URL。同时这个注解中还有很多其他值可以设置,我们这里只是一个快速入门了解的示例所以就不多说了,具体的可以去Spring官网参考相关文档。

服务调用

@Autowired
private UserService userService;

@GetMapping("feign")
public JsonResponse<UserDto> getUserInfo2(@RequestParam("id")Integer id){
    JsonResponse<UserDto> jsonResponse = userService.getUser(id);
    if (!ResponseCode.OK.getCode().equals(jsonResponse.getCode())){
        throw new YsException(String.format("错误的响应码:[%s]",jsonResponse));
    }
    return JsonResponse.ok(jsonResponse.getData());
}

上面就是我们调用服务的使用示例,看上去是不是很简单。我们并没有去实现 「UserService」 接口,它的实现是由OpenFeign去帮我创建代理实现的。

当然OpenFeign的工具远远不止于此,它还可以配置SpringCloud中的LoadBalance来实现负载均衡,还可以结合circuitBreaker来实现熔断和降级等功能,关于这部分内容在后面将到了再细说。

总结

简单的来说,OpenFeign主要是用来实现服务之间的调用的,它解决了服务之间调用的一些麻烦的问题。
可以通过下面方式下载本章节示例代码:

git clone -b openFeign https://gitee.com/zengchao_workspace/ys.git

欢迎关注公号:「一个Java菜鸟程序员 ,本公众号会不定期更新各类文章,欢迎订阅观看谢谢!


原文始发于微信公众号(一只菜鸟程序员):SpringBoot服务调用-OpenFeign-H版

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/73125.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!