使用Feign进行服务访问

在SpringCloud中使用Feign进行服务的访问

之前已经说过了SpringCloud作为“分布式微服务”的解决方案时的大概原理和方法了。就是一个个web应用之间的访问,之前的访问方式有两种:

  • 使用RestTemplate这个封装好的类,使用ip+端口+服务地址进行访问,这是最简单的访问方式了
@GetMapping("demo1/consumer/hello/{id}")
public String hello(@PathVariable("id") String id){
        //远程调用provider中的接口
    return restTemplate.getForObject("http://localhost:8001/demo1/provider/hello/"+id,String.class);
}
  • 使用Ribbon进行访问负载均衡,也就是将“提供者”注册到注册中心,然后“消费者”使用微服务名进行访问
@GetMapping("demo3/consumer/hello/{id}")
public String hello(@PathVariable("id") String id){
        //远程调用provider中的接口
        return restTemplate.getForObject("http://demo3-ribbon-provider/demo3/provider/hello/"+id,String.class);
}

但是呢?这么访问还是很麻烦,使用restTemplate访问时,要对参数进行拼接。那么有没有更好的方法呢?

而且,如果我们想和RPC框架一样(比如Dubbo等),使用本地接口就可以访问呢?那么我们就要引入Feign

1. 创建一个服务访问的接口

既然我们想像在本地访问一样来调用远程“微服务”接口,当然,将远程代码写在本项目中是不可能的,那么就创建一个接口来访问

  • 创建一个新的项目 demo4-feign-interface

其实你创建这个项目就是为了让消费者微服务进行依赖的,当然你可以直接在你的消费者项目中创建这个接口,但是并不利于管理,所以就新创建了一个项目,专门用来写feign的接口

  • pom.xml(导入Feign客户端的依赖)
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
  • 然后编写接口的Service类
package cn.lyn4ever.provider;

import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

/**
 * 这个注解表明这是一个Feign的客户端,
 * 其中的value属性就是目标微服务的服务名
 */
@FeignClient(value = "demo3-ribbon-provider")
public interface ProviderService {
    /**
     * 这个其实是provider提供者中的方法
     *
     * @param id
     * @return
     */
    @GetMapping("demo3/provider/hello/{id}")
    public String hello(@PathVariable("id") Integer id);
}

主要看一下上边的FeignClient注解中的value值,就是目标微服务中的服务名

这个hello()方法以及注解中的内容,全部都是项目demo3-ribbon-provider中的

  • 然后,使用maven的命令,clean 然后install到本地仓库中以便于其他的项目进行调用
  • 这个应用只是做为一个消费者的依赖,所以并不需要启动类

2.创建一个新的项目,使用Feign进行访问

  • 创建新的使用Feign的消费者项目,将之前的demo3-consumer复制一份,然后修改如下:
  • pom.xml添加feign的依赖和我们之前创建的demo4-feign-interface
<!--之前的依赖省略,请查看源码-->
<!--feign的依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>

<!--之前创建的feign接口项目-->
<dependency>
    <groupId>cn.lyn4ever</groupId>
    <artifactId>demo4-feign-interface</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
  • application.yml 不用修改,还是将之前的配置文件复制过来
  • 在启动类上添加注解,声明Feign的调用包名
@EnableFeignClients(basePackages= {"cn.lyn4ever.provider"})
  • 接下来就是修改我们的controller类,可以使用本地接口进行访问了
@RestController
public class HelloConsumerController {

    @Autowired
    private ProviderService providerService;

    @GetMapping("demo4/consumer/hello/{id}")
    public String hello(@PathVariable("id") Integer id){
        //直接使用本地的接口就可以访问了
        return providerService.hello(id);
    }
}

这们,启动Eureka集群、三个provicder的服务提供者、刚才创建的这个服务消费者,然后使用浏览器进行访问

3.使用Feign进行访问有什么好处及其原理?

  • 使用FeignClient访问时,可以不用再使用ip+port或者使用微服务名进行访问。可以直接在Autowired后,在本地调用方法
  • 其实就是Feign在本地生成了动态代理,可以直接使用Autowired调用。其本质还是使用Ribbon进行负载均衡访问
  • Feign中内置了Ribbon进行负载均衡,所以也同样可以像Ribbon一样进行自定义负载均衡算法

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Feign 是 Netflix 开源的一款声明式 HTTP 客户端,用于简化 HTTP API 的调用过程。它可以让你通过注解的方式非常方便地发送 HTTP 请求,并处理响应数据。 ### 使用 Feign 访问百度API 首先,你需要添加 Feign 和依赖到你的项目中。如果你使用的是 Spring Boot,通常会在 `pom.xml` 或者 `build.gradle` 文件中添加相应的依赖: #### Maven 示例 ```xml <dependencies> <!-- 添加 Feign 依赖 --> <dependency> <groupId>com.netflix.feign</groupId> <artifactId>feign-core</artifactId> <version>10.x.y</version> </dependency> <!-- 添加 Jackson JSON 库依赖,用于序列化和反序列化 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.x.y</version> </dependency> <!-- 添加 OkHttp 作为底层 HTTP 客户端 --> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.x.y</version> </dependency> </dependencies> ``` 接下来,在你的代码中创建一个 Feign 接口: ```java import com.google.gson.Gson; import feign.Feign; import feign.Logger; public class BaiduApiService { private static final Logger.Level FEIGN_LOG_LEVEL = Logger.Level.BASIC; // 可选择 BASIC、OFF 或者 FULL 等 public static void main(String[] args) { // 创建 FeignClient 实例并配置日志级别 Gson gson = new Gson(); Feign.Builder builder = Feign.builder() .encoder(new GsonEncoder(gson)) .decoder(new GsonDecoder(gson)) .logLevel(FEIGN_LOG_LEVEL); BaiduApiService api = builder.target(BaiduApiService.class, "https://www.baidu.com"); String result = api.getBaiduSearchResult("示例查询内容"); System.out.println(result); } interface BaiduApiService { @GET("/s") String getBaiduSearchResult(@QueryParam("wd") String query); } } ``` 在这个例子中,我们创建了一个为 `BaiduApiService` 的 Feign 接口,并使用了默认的 `OkHttpClient` 作为底层的 HTTP 客户端。我们通过 `@GET` 注解指定了请求的方法以及 URL 中的查询参数 `wd`。 ### 相关问题: 1. **如何自定义 Feign 日志记录?** - 可以通过调整 `Logger.Level` 来改变日志级别的详细程度。 2. **为什么需要引入 Jackson JSON 库?** - Feign 默认使用 JSON 格式传输数据,Jackson 提供了强大的 JSON 序列化和反序列化功能,因此需要添加 Jackson 的依赖库。 3. **如果使用 Spring Boot 集成 Feign 怎么操作?** - 可以在Spring Boot应用的配置文件 (`application.properties` 或 `application.yml`) 中指定 Feign 的客户端配置项,例如超时时间、连接池大小等。同时可以在 Spring Bean 中注入 Feign 接口实例来进行使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值