Spring Cloud中集成Feign
(只是笔记而已 其中有点命名啥的不对应,搜到了就划走吧)
Feign--[feɪn]:Web 服务客户端,能够简化 HTTP 接口的调用。
没有Feign的之前服务提供者
package com.springcloudprovide.controller;import com.springcloudprovide.service.UserName;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserController {@Autowiredprivate UserName userName;@RequestMapping("username")public String getUserName(){return userName.getUsername();}
}
服务消费者,通过RestTemplate来调用服务提供者的服务接口
package com.springcloudconsumer.tempalte;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;@Configuration
public class RestTemplateConfiguration {@Bean@LoadBalancedpublic RestTemplate getRestTmplate(){return new RestTemplate();}
}
package com.springcloudconsumer.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;@RestController
public class UserBeanController {@Autowiredprivate RestTemplate restTemplate;@RequestMapping("/showName")public String getUserName(){System.out.println("123");return restTemplate.getForObject("http://localhost:8081/username", String.class);}
}
Feign的使用
创建基于Eureka模块的注册中心和服务提供者
基于Feign的服务消费者
org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-starter-netflix-eureka-client 3.0.2 org.springframework.cloud spring-cloud-starter-openfeign 3.0.2
定义Feign的客户端接口
package com.springcloud.feign.service;import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;@FeignClient(value = "eurekaprovider")
public interface UserServiceFeign {@RequestMapping("username")public String getUserName();
}
这个注解@FeignClient标识当前是一个 Feign 的客户端,value 属性是对应的服务名称,也就是你需要调用哪个服务中的接口。
创建服务消费者的控制类
package com.wangxing.eurekacomsumer.eurekacomsumerdemo.controller;
import com.wangxing.eurekacomsumer.eurekacomsumerdemo.serviceclient.UserFeignClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;=
@RestController
public class UserBeanController {//注入一个Feign的客户端对象@Autowiredprivate UserFeignClient userFeignClient;@RequestMapping("/showName.do")public String getUserName(){return userFeignClient.getUserName();}
}
配置主类
package com.springcloud.feign;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.cloud.openfeign.EnableFeignClients;@SpringBootApplication
@EnableHystrix
@EnableFeignClients
public class SpringcloudFeignApplication {public static void main(String[] args) {SpringApplication.run(SpringcloudFeignApplication.class, args);}}
如果你的 Feign 接口定义跟你的启动类不在同一个包名下,还需要制定扫描的包名 @EnableFeignClients(basePackages=“com.fangjia.api.client”)
通过跟之前的代码相比可以发现,我们的调用方式变得越来越简单了,从最开始的指定地址,到后面通过 Eureka 中的服务名称来调用,再到现在直接通过定义接口来调用。
Feign 提供了很多的扩展机制,让用户可以更加灵活的使用,这节我们来学习 Feign 的一些自定义配置。
使用配置自定义 Feign 的配置
除了使用代码的方式来对 Feign 进行配置,我们还可以通过配置文件的方式来指定 Feign 的配置。
# 链接超时时间
feign.client.config.feignName.connectTimeout=5000
# 读取超时时间
feign.client.config.feignName.readTimeout=5000
# 日志等级
feign.client.config.feignName.loggerLevel=full
# 重试
feign.client.config.feignName.retryer=com.example.SimpleRetryer
# 拦截器
feign.client.config.feignName.requestInterceptors[0]=com.example.FooRequestInterceptor
feign.client.config.feignName.requestInterceptors[1]=com.example.BarRequestInterceptor
# 编码器
feign.client.config.feignName.encoder=com.example.SimpleEncoder
# 解码器
feign.client.config.feignName.decoder=com.example.SimpleDecoder
# 契约
feign.client.config.feignName.contract=com.example.SimpleContract