springcloud 实战:服务间通信—,java 系统开发教程
由于每个工程的基础包名都不一致,如 user 工程包名为 com.lynn.blog.user,public 工程包名为 com.lynn.blog.pub,这里需要指定 basePackages 为 com. lynn.blog,以保证 Spring 容器可以扫描到 OpenFeign 注入的类(如果不指定 basePackages,则默认扫描加入该注解的类所在包及其子包)。
(3)创建 TestserviceFeign 接口,并编写以下代码:
@FeignClient(value = "test")
public interface TestServiceFeign {
@RequestMapping("/test")
String test();
}
其中,@Feignclient("test")表示该接口是一个 OpenFeign 的 HTTP 客户端,注解内指定服务名,本示例指定 test,即 test 工程下 spring.application.name 配置的值。接口定义只需和 test 工程的控制器提供的接口一致(参数名、返回值和
接口地址)即可,需要注意的是,@RequestMapping 指定的地址为接口地址全路径。
(4)创建控制器验证 OpenFeign 的正确性。
@RequestMapping("feign")
@RestController
public class TestControllerFeign {
@Autowired
TestServiceFeign testServiceFeign;@RequestMapping( "test")
private String test(){
return testServiceFeign.test();
}
}
(5)重启 comment 工程,浏览器多次访问地址 http://localhost:8203/feign/test,可以看到分别打印了 9999 和 9998 端口。
通过上述示例,我们发现 OpenFeign 使代码变得更加优雅,无须使用 RestTemplate 显式地调用 HTTP 服务,只需要指定想要调用的服务名即可。由于 OpenFeign 内部集成了 Ribbon,所以它也默认拥有了负载均衡能力。
自定义 OpenFeign 配置
===============
OpenFeign 提供了默认的配置类 FeignclientsConfiguration,该类使用了默认的编码器( encoder )、解码器( decoder )、合约( contract)等。因为 OpenFeign 的核心是 HTTP 客户端,HTTP 传输是通过数据包(流)进行的,所以在发送请求、接受响应的过程中,有必要对数据进行编码和解码。而 OpenFeign 默认使用的合约是 SpringMvcContrace,它表示 OpenFeign 可以使用 Spring MVC 的注解,即上一节代码编写的 @RequestMapping。
Spring Cloud OpenFeign 允许通过 @Feignclient 注解的 configuration 属性编写自定义配置,自定义配置会覆盖默认的配置。
接下来,我们以覆盖合约为例,讲解自定义配置的编写。
创建一个 OpenFeign 的配置类 MyFeignconfiguration,其代码如下:
@SpringBootConfiguration
public class MyFeignConfiguration {
@Bean
public Contract feigncontract()i
return new feign.contract.Default();
}
}
上述代码定义了一个 Bean 方法,返回 Contract,即 OpenFeign 合约,该合约返回的是 OpenFeign 的默认合约,这样我们就可以使用 OpenFeign 的注解而不用 Spring MVC 注解。
修改 TestServiceFeign 接口,将 @RequestMapping 注解替换成 @RequestLine 注解,并通过 configuration 属性指定自定义配置,如:
@Feignclient(value = "test",fallback = TestserviceErrorFeign.class,configuration =
MyFeignConfiguration.class)
public interface TestServiceFeign {
评论