SpringCloud中Feign

之前我们提到过在Java中可以通过RestTemplate来进行发送请求,但是我们在使用RestTemplate的时候,比较麻烦,在下文中,我也会详细的讲解一下RestTemplate和Feign的具体区别,不过首先我们要先学会使用Feign

1.Feign的配置及使用

对Feign进行配置

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

配置完成后,我们需要在发送请求的Module中的启动类上添加注解@EnableFeignClients

@SpringBootApplication
@EnableFeignClients

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

这个注解@EnableFeignClients的作用是用于扫描那些要使用@FeignClient注解,其工作的原理和@Configuration相似,都是用于扫描注册的,下面我们就来写如何发起请求

@FeignClient(value = "Service",url = "http://localhost:8082")
public interface Resttemp {
    @GetMapping("/name1/demo1")
    User add();
    }

注意一下这里我声明的是一个接口,这是使用Feign必须要做的,因为Feign的注册的注解@FeignClient要使用在接口上,注解中的Value代表的是要访问的服务,就是说要接受这个请求的服务名,而服务名在nacos中是需要提前先写清楚的,这里URL是为了声明清楚我的端口号,因为Feign更愿意简化步骤,所以使用@GetMapping和SpringMVC写接口一样的注解,目的就是为了方便记忆,不用重新写注解去访问具体的路径。

因为我们这里使用的interface还没有启动,我们可以使用一个接口来进行跨端口的调用,就是说访问这个端口的时候,而实际访问的是另外的端口,也就实现了当中数据的共享,这样就可以实现微服务之间的数据通信

@RestController
@RequestMapping("/name")
public class Test {
    @Autowired
    public Resttemp resttemp;
    @RequestMapping("/demo")
    public User test(){
        User add = resttemp.add();
        System.out.println(add);
        return add;
    }
}
//这个发送的配置端口为8089

我们写好了这个接口后,我们解释一下,这里发送就是在8089的端口号上,接下来我们写接收端

@RestController
@RequestMapping("/name1")
public class Service {

    @RequestMapping("/demo1")
    @ResponseBody
    public void returnname(){
        System.out.println("收到Feign调用");
    }
}
//在接收端使用8082端口

注意一下!在发送的接口的路径必须得和接收端的一样,要不然肯定发不了,我们启动一下就可以正常的使用Feign

同时启动两个项目,并且记得!!启动Nacos,我们尝试在8089的/name/demo端口发送请求,看看是否会8082端口是否响应数据

 响应成功,发送成功,后面就具体讲解一下Feign的补充

Feign的自定义配置

我们通常在使用Feign的过程中,还会进行别的配置,以下我会给大家罗列别的参数的配置

①feign.Logger.Level 用来修改日志级别,有四种级别:NONE(默认),BASIC,HEADERS,FULL

通过配置feign.client.config.服务名.loggerLevel:BASIC,服务名如果填写单独的服务名是局部生效,填default代表全局生效

②feign.codec.Decoder 用来响应结果的解析器,相当于远程调用做解析,解析json字符串转为java对象

③feign.codec.Encoder 用来给请求的参数编码,以便于发送http请求

④feign.Contract 用来支持注解,默认是SpringMVC的注解

⑤feign.Retryer 用来设置请求失败重试,请求失败的重试,默认是未开启的,不过会使用Ribbon的重试

其实只是作为了解就好,大多数的配置是不会变动的,一般变动的是修改日志级别,我们接下来讲一下Feign的优化

Feign的优化

很多人有疑问,Feign已经是对RestTemplate的优化了,还有什么可以优化的呢?这里我们就得说一下了,因为Feign在底层发送请求其实是JDK的URLConnection来实现的,而这种发送请求的劣势就和JDBC一样,不能够进行均衡,数据库就会采用数据库池来进行优化,所以我们的Feign也可以像数据库这种一样,增加连接池,对性能进行优化,我们只需要在配置中配置成这样

feign:
  httpclient:
    enabled: true #是否开启连接池
    max-connections: 200 #最大连接数
    max-connections-per-route: 50 #单个路径最大连接数

另外一个就要讲到我们的配置修改日志的级别问题了,在当中我们默认的是没有开启日志,其实就已经做了优化,没有必要的情况是没有必要开启FULL,或者添加HEADERS,因为增加之后是会让服务器的负担加重只会降低效率,所以一般使用NULL或者BASIC

Feign和RestTemplate的区别

①首先我们从代码的角度来看两者的代码,不难发现,RestTemplate设置的东西比Feign多,因为Feign使用SpringMVC的注解方便快捷的替代了RestTemplate中的URL的设置,参数的设置。

②在RestTemplate中会有两种情况,一种是在Nacos注册中心使用(注册服务名),这种来调动RestTemplate是通过路径+端口号然后经过HTTP的转发,跳转到对应的服务接口(因为在Nacos中进行配置的,所以我们是可以通过LoadBalanced来进行负载均衡),另外一种是不通过Nacos注册中心使用,我们就可以直接通过路径+端口号请求接口

而Feign不同的是它的底层是通过动态代理来实现,当有@FeignClient注解时,@EnableFeignClient就会扫描到这个@FeignClient下的接口,创建一个动态代理的对象,而调用这个对象,就是通过我们在@FeignClient上的value值在Nacos中找到对应的服务,并在@GetMapping中获取到对应的路径和参数,最后在进行HTTP的远程调用

有时间在给更新一下HTTP的远程调用的实现

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全栈Demo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值