1:前面我们已经构建了消费者和生产者并成功注册到nacos注册中心那么生产者和消费者之间是如何调用呢,本章我们讲讨论Feign 帮我们实现远程调用。
首先我们简单对 Feign 了解一下
Feign 是一个声明式的伪 Http 客户端,它使得写 Http 客户端变得更简单。使用 Feign,只需要创建一个接口并注解。它具有可插拔的注解特性,可使用 Feign 注解和 JAX-RS 注解。Feign 支持可插拔的编码器和解码器。Feign 默认集成了 Ribbon,Nacos 也很好的兼容了 Feign,默认实现了负载均衡的效果
Feign 采用的是基于接口的注解
Feign 整合了 ribbon
2:老规矩直接上手写代码,但是本章动手之前先对项目进行一定的改造这样使项目更加贴近实战及让人更好的感觉到Feign给我们代来的便捷的用法。
2.1 在父项目上新建子节点项目 spring-cloud-alibaba-study-clients 同样本项目不用任何配置逻辑所以直接删除src目录下的resources保留java目录,且此工程不用使用同一配置否则maven打包会出现异常。
2.2 pom文件如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.hyl.study</groupId>
<artifactId>spring-cloud-alibaba-study-cilents</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-cloud-alibaba-study-cilents</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR1</spring-cloud.version>
</properties>
<dependencies>
<!--feign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.3 如有启动类就删除启动类次工程不需要启动类并建立如下目录
建立生产者接口;@FeignClient(value = "study-provider", contextId = "testProvider")
@FeignClient:Feign客服端标签代表使用Feign远程调用,
Value :服务提供者名称
contextId : bean的名称(建议别包含“_”)
3.做完以上改造工作后我们开始对消费者和生产者集成Feign客服端进行编码,
3.1首先对生产者进行修改
A: 在pom文件里面加上如下代码
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--引入clients-->
<dependency>
<groupId>com.hyl.study</groupId>
<artifactId>spring-cloud-alibaba-study-cilents</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
B: 对api进行修改 让其实现我们在clients工程里面定义的服务端接口
@RestController
public class TestProviderApi implements TestProviderClient {
@Override
public String getTest(){
return "provider测试一下";
}
}
C:修改启动类
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients //打开Feign客服端
public class SpringCloudAlibabaStudyProviderApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudAlibabaStudyProviderApplication.class, args);
}
}
4:对消费者进行修改
4.1 修改pom文件加入如下代码
<!--feign依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--引入clients-->
<dependency>
<groupId>com.hyl.study</groupId>
<artifactId>spring-cloud-alibaba-study-cilents</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
4.2 对api进行修改
@RestController
@RequestMapping("test_consumer")
@Slf4j
public class TestConsumerApi {
@Autowired
private TestProviderClient testProviderClient;
@RequestMapping("/get_test")
public String getTest(){
String result = testProviderClient.getTest();
log.info("远程调用结果:{}",result);
return "consumer测试一下";
}
}
直接在代码中注入TestProviderClient 并打印远程调用结果
(@Slf4j 这个是lombok提供的这里暂不做具体讲解)
4.3 修改启动类
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients //添加此标签代表打开feign客户端
public class SpringCloudAlibabaStudyConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudAlibabaStudyConsumerApplication.class, args);
}
}
5:基于以上集成feign客户端编码已近基本完成。现在分别重启生产者和消费者启动后在nacos控制台可以看见如下界面
在浏览器访问消费者api
Api正常打印在看控制台远程调用日志打印也能正确打印我们的预期值。
Feign除了给我调通远程调用功能外还集成 Ribbon 实现了负载均衡 我们简单做一下测试
为了使访问更加清晰我们对生产者api简单改写让返给给调用者端口:
@RestController
public class TestProviderApi implements TestProviderClient {
@Value("${server.port}")
private String port;
@Override
public String getTest(){
return "provider测试一下调用端口:"+port;
}
}
重启服务 ,修改生产者端口 (不要停掉原来的服务,也可在启动项修改这里我们采用修改配置文件)
server:
port: 9528
Idea修改启动设置把划线部分√去掉即可 再次启动生产者:
打开nacos控制台此时发现生产者已经有两个实例
我们在浏览器多次刷新消费者api空控制台打印日志
可以看出Feign内部给我采用了轮询的负载均衡算法,查看源码可知默认给我们实现了如下负载均衡算法:
com.netflix.loadbalancer.RandomRule #配置规则 随机
com.netflix.loadbalancer.RoundRobinRule #配置规则 轮询
com.netflix.loadbalancer.RetryRule #配置规则 重试
com.netflix.loadbalancer.WeightedResponseTimeRule #配置规则 响应时间权重
com.netflix.loadbalancer.BestAvailableRule #配置规则 最空闲连接策略
当然我们也可以自定义自己的的负载均衡算法根据自己的项目需要配置或者自定义负载均衡算法。
我们可以通过以下配置修改负载均衡算法:
我们在消费者的.yml加入如下配置(我们制定负载均衡算法为随机) feign和ribbon结合,指定策略。feign默认的是轮询的策略,这里的配置可以自定义
study-provider: #服务名称
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
到目前为止一个简单的spring cloud alibaba 微服务项目基本上已经搭建成功。以下章节我们继续讨论其他组件。
本项目地址:https://gitee.com/hylgj/spring-cloud-alibaba-study.git