Feign是一个声明式Web Service客户端。使用Feign能让编写Web Service客户端更加简单, 它的使用方法是定义一个接口,然后在上面添加注解,同时也支持JAX-RS标准的注解。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。
-
创建远程调用
在上次的eureka-client中新增controller方法,返回一条带参信息
@RestController
public class ClientController {
@RequestMapping("/message")
public String clientMessage(@RequestParam("name") String name) {
return name + " congratulation to you!";
}
}
然后新建一个eureka-consumer-feign模块,导入需要的Feign依赖,生成模块后依赖如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
配置文件:
spring:
application:
name: eureka-consumer-feign
server:
port: 8763
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
在启动文件上新增@EnableFeignClients注解,表示这是Feign调用的客户端
@SpringBootApplication
@EnableFeignClients
@EnableEurekaClient
public class EurekaConsumerFeignApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaConsumerFeignApplication.class, args);
}
}
添加远程调用,其中@FeignClient注解的value需要指向eureka-client,因为是要从client那里调用的,然后接口里的方法名称,地址,参数类型都要和调用client的一样
@FeignClient("eureka-client")
public interface FeignRemote {
@RequestMapping(value = "/message")
public String clientMessage(@RequestParam("name") String name);
}
然后是consumer自己的controller方法,注入FeignRemote并且在自己的方法中调用由FeignRemote调用的方法
@RestController
public class ConsumerController {
@Autowired
FeignRemote feignRemote;
@RequestMapping("/message/{name}")
public String consumerMessage(@PathVariable("name") String name) {
return feignRemote.clientMessage(name);
}
}
-
测试调用
分别启动server、client、consumer三个程序,然后访问http://localhost:8762/message?name=hong,结果返回一条信息
然后访问http://localhost:8763/message/hong,得到通过使用client的方法返回的信息,说明服务消费(调用)成功
-
负载均衡
新建eureka-client-load-balance模块,导入的依赖和client模块一样,启动文件注解一样,配置文件修改了端口号
spring:
application:
name: eureka-client
server:
port: 8764
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
然后修改client的controller方法,修改返回信息
@RestController
public class ClientController {
@RequestMapping("/message")
public String clientMessage(@RequestParam("name") String name) {
return name + " i am load balance service";
}
}
启动eureka-client-load-balance模块,打开注册中心,可以看见client有两个服务
然后访问http://localhost:8763/message/hong,结果如下
发现返回的信息会在两条交替出现,说明负载均衡功能已实现,增加多个服务提供者,结果也会是在多个服务中切换。
demo地址:https://github.com/hong52ni/SpringCloud-Demo-Aggregate