欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringCloud核心组件-------Feign

程序员文章站 2022-06-13 10:30:21
...

浅谈SpringCloud服务间的调用

SpringCloud是由一个个微服务构成的,所以这就存在着服务与服务之间的调用,据我所知,微服务之间的调用方式有两种,第一种通过Feign调用其他服务,第二种是通过RestTemplate进行服务间调用的,下面就来说说具体的调用方式。

一、通过Feign进行调用

在使用Feign进行为服务的调用之前需要进行两步操作
1.加入Feign所需依赖:

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

2.在启动类上加入开启Feign的注解

@EnableFeignClients
@EnableEurekaClient
@MapperScan("com.gaei.web.dao")
@SpringBootApplication
public class ProblemApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProblemApplication.class, args);
    }
    
}

开始调用服务的操作总共分为两步:
1、创建可供调用的方法,直接在被调用的服务中创建一个Controller如下代码,我就只贴Controller的代码了:

@RestController
@RequestMapping("/message")
public class MessageController {

	@Autowired
    private SysMessageService sysMessageService;
	/**
     * 发送系统消息
     *
     * @return
     * @throws IOException
     */
    @RequestMapping(value = "sendSystemMessage", method = RequestMethod.POST)
    public void sendSystemMessage(@RequestBody SysMessage message,@RequestParam String username) throws Exception {
        sysMessageService.sendSystemMessage(message, username);
    }

}

2.在调用者中创建调用服务的工具接口,这个工具类需要使用注解@FeignClient进行注解,代码如下所示:

@FeignClient(name = "service-zuul")
public interface ZuulInterface {

	/**
     * 发送系统消息
     * @return Response
     */
    @RequestMapping(value = "/message/sendSystemMessage", method = RequestMethod.POST)
    void sendSystemMessage(@RequestBody Message message,@RequestParam("username") String username);

}

调用的时候直接在调用者服务中像调用自己服务的方法一样调用就可以了。

二、使用RestTemplate进行服务调用

这种方法我也不大熟悉权当做笔记,我就简单的记录一下怎么使用,记录其中的一种调用方式,使用注解的方式(我一直感觉使用注解很简便),代码如下:
1.创建配置类,可在这里面定义负载均衡的算法。

@Component
public class RestTemplateConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

2.将RestTemplate对象注入到需要调用服务的类中

	@Autowired
    private RestTemplate restTemplate;

    @GetMapping("/getMsg")
    public String getMsg(){
        String response=restTemplate.getForObject("http://MSG/msg",String.class);
        return response;
    }

生产者代码:

@RestController
public class ServerController {

    @GetMapping("/msg")
    public String msg() {
        return "this is a msg";
    }
}

因为我目前的项目使用的是Feign调用服务的,所以我说一下Feign
百度百科对其英文释义:创造或虚构,假装;装作;作假。根据其意思我们可以联想:在本地创建一个虚假的接口以连接真实,用一句话来总结,梦想照进现实。
Feign是通过动态代理的方式创建代理类,当服务启动时(是服务启动时还是调用时不大确定,有待考证,哪位大佬知道的麻烦留言感激不尽)创建动态代理类,Feign集成了Ribbon和RestTemplate是一个轻量级的 RESTful 的 HTTP 服务客户端,实现了复杂均衡和Rest调用的框架,其负载均衡的默认方法是轮询法,可以通过配置类进行修改。
Feign是通过Java注解的方式底层封装HttpClient进行发送Http请求发起远程调用。
其工作流程如下所示(图盗的,懒的画):
SpringCloud核心组件-------Feign
下面我口头解释一下调用流程
1.服务启动时,通过JDK动态代理生成代理类。
2.在调用时,通过Contract协议规则解析接口信息初步生成url请求
3.通过负载均衡生成最终请求。
4.通过集成的RestTemplate进行Rest远程调用。

下一篇讲述Feign集成的Hystrix进行隔离、熔断、降级。