SpringCloud详解 第四章声明式服务调用 Feign(一)
本章做Feign的基本了解与使用
Feign简介:
Feign是一个声明式的Web服务客户端,使用Feign可使得Web服务客户端的写入更加方便.它具有可插拔注释支持,包括Feign注解和JAX-RS注解、Feign还支持可插拔编码器和解码器、Spring Cloud增加了对Spring MVC注释的支持,并HttpMessageConverters在Spring Web中使用了默认使用的相同方式。Spring Cloud集成了Ribbon和Eureka,在使用Feign时提供负载平衡的http客户端。Fegin对Robbin进行了封装,如果需要配置自己的负载算法,可以自定义Ribbon的算法即可。 Spring Cloud Feign 提供的声明式服务绑定功能来实现对该服务接口的调用。
1.创建 一 个 Spring Boot 基础工程,对pom文件修改
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Finchley.SR3</spring-cloud.version> </properties> <dependencyManagement> <dependencies> <dependency> <!-- SpringCloud 所有子项目 版本集中管理. 统一所有SpringCloud依赖项目的版本依赖--> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> <version>1.4.6.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies> <build> <plugins> <plugin><!-- SpringBoot 项目打jar包的Maven插件 --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
2.application.yml
server: port: 9012 spring: application: name: feign-server #服务注册到Eureka上使用的名称 eureka: client: serviceUrl: defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/ instance: instance-id: feign-server-9012 prefer-ip-address: true #访问路径显示IP地址
3.修改主启动类
@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients(basePackages = {"com.wuzz.demo"}) public class FeignApp { public static void main( String[] args ) { SpringApplication.run(FeignApp.class, args); } }
4.负载均衡配置
@Configuration public class ConfigBean { // Eureka是基于REST(Representational State Transfer)服务, // 主要以AWS云服务为支撑,提供服务发现并实现负载均衡和故障转移。 // 我们称此服务为Eureka服务。 // Eureka提供了Java客户端组件,Eureka Client,方便与服务端的交互。 // 客户端内置了基于round-robin实现的简单负载均衡。 // 在Netflix,为Eureka提供更为复杂的负载均衡方案进行封装, // 以实现高可用,它包括基于流量、资源利用率以及请求返回状态的加权负载均衡。 /** * Ribbon是Netflix发布的云中间层服务开源项目,主要功能是提供客户端负载均衡算法。 Ribbon客户端组件提供一系列完善的配置项,如,连接超时,重试等。 简单的说,Ribbon是一个客户端负载均衡器, 我们可以在配置文件中列出load Balancer后面所有的机器, Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器, 我们也很容易使用Ribbon实现自定义的负载均衡算法 * */ // Feign是一个声明式的Web服务客户端,使用Feign可使得Web服务客户端的写入更加方便。 // 它具有可插拔注释支持,包括Feign注解和JAX-RS注解、Feign还支持可插拔编码器和解码器、 // Spring Cloud增加了对Spring MVC注释的支持, // 并HttpMessageConverters在Spring Web中使用了默认使用的相同方式。 // Spring Cloud集成了Ribbon和Eureka,在使用Feign时提供负载平衡的http客户端。 @Bean @LoadBalanced // ribbon是客户端 的负载均衡工具 //默认算法是轮询算法 核心组件IRule public RestTemplate getRestTemplate() { return new RestTemplate(); } @Bean public IRule myRule() { // 负载均衡算法。。。。 // return new RoundRobinRule(); return new RandomRule(); } }
5.声明式服务类
@FeignClient(value ="cloud-provider") public interface ClientService { //如果feign代理的是get请求,必须用@RequestMapping 不能用@GetMapping // 每个参数必须带上@RequestParam,否则会报post not support! @RequestMapping(value = "/hello", method = RequestMethod.GET) String hello(@RequestParam("id") String id) ; }
6.controller
@RestController public class FeignController { @Autowired private ClientService service; @RequestMapping(value ="/feign/hello") public String hello() { return service.hello("1"); } }