SpringCloud微服务学习日志-Feign

一.为什么要使用feign

在之前发起微服务调用的时候,我们采用的都是RestTemplate提供的http请求进行调用。

发起http请求

其实,这样的一种调用方式会造成一个问题。当请求里面的URL参数过多的时候,我们一个个地去拼接字符串来发起请求,这样会显得代码十分的不美观。 但是我们用feign进行声明式调用的话:

这样的话代码是不是直观了许多,并且也不存在当参数过多时候要去把一大堆参数和变量拼接的情况。

二.Feign的使用

(一).引入依赖

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

(二).在启动类上加入注解 @EnableFeignClients

@SpringBootApplication
@EnableFeignClients   //开启Feign
public class ServiceApplication {

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

    @Bean
    @LoadBalanced //添加负载均衡
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

(三).编写Feign客户端

 

(四).注入,发起请求


    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private ServiceB serviceB;  //注入刚刚写的Feign客户端

    @GetMapping("test")
    public String ServiceATest(){
//        String url = "http://ServiceB/serviceB/test";
//        String forObject = restTemplate.getForObject(url, String.class);
           //发起Feign请求
        String result = serviceB.serviceB("666");
        return "ServiceA Working and " + result;
    }

ServiceA发起请求

public class ServiceBController {
    @GetMapping("test/{pm}")
    public String ServiceBTest(@PathVariable String pm){
        log.info("B被调用了");
        return "ServiceB Working and the parameter is" + pm;
    }
}

 ServiceB

到此,我们就可以基于feign声明式客户端的方法,发起http请求。但是,我们的负载均衡怎么办? 

feign的依赖里面自带的有ribbon进行负载均衡的,只不过我这里的nacos里面也带了个ribbon所以这里的ribbon就自动忽略掉了 

三.Feign的日志配置

在applicaiton.yml里加入:

feign:
  client:
    config:
    //default代表全局生效
      default: 
        logger-level: none //none表示没有,basic带请求耗时,header带请求头请求地址,full啥都带
    //这里写服务名代表对某个服务生效
#     ServiceB:
#       logger-level: none


四.Feign使用连接池

Feign默认使用的是Apache的UrlConnection作为底层,UrlConnection不支持连接池。这样的话每次连接都会产生一次开启和关闭连接的流程,会极大消耗服务器资源的使用。因此可以引用Okhttp和httpclient来支持连接池。这里使用httpclient。

(一).引入依赖

        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-httpclient</artifactId>
        </dependency>

(二).修改application.yml

feign:
  client:
    config:
      default:
        logger-level: none
  httpclient:
    enabled: true   //启用httpclient
    max-connections: 200       //最大连接数,根据实际情况配置
    max-connections-per-route: 50        //每个路径最大连接数,根据实际情况配置

五.Feign的最佳实践

feign从使用上来说没有100%完美的使用方案,这里会给出两种较为主流的方案:

(一).将消费者的FeignClient与提供者的Controller抽取出来

 



  • 优点:定义了统一的规范,实现简单
  • 缺点:耦合度较高,且对Mvc无效

(二).将FeignClient及其涉及的POJO类,Feign的配置定义到一个Module中 

 注意,使用这种方法需要在@EnableFeignClients里指定Feignclient所在的包或者字节码文件,否则无法使用。

//指定FeignClient所在的包
@EnableFeignClients(basePackages ="com.xx.xxxxx")

//指定FeignClient所在的字节码文件
@EnableFeignClients(clients = {xxxxxxx.class})

推荐方式2,按需导入
  • 优点:耦合度角度
  • 缺点:容易引入大量无用的类

两种方案皆有优缺点,需要在开发时进行取舍。以上就是Feign的使用以及注意事项

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值