nacos+feign实现服务之间调用,详细教程
内容介绍:
Ribbon
提供客户端的软件负载均衡算法。它基于Http和Tcp的客户端负载均衡,使得面向REST请求时变换为客户端的负载服务调用。
1.简单的轮询负载均衡
2.加权响应时间负载均衡
3.区域感知轮询负载均衡
4.随机负载均衡
Feign
- Feign 伪装,就是将 RestTmplate 发送的http请求转化为接口进行访问
- feign 作用就是简化开发,负载均衡,远程调用,容错(解决单点故障,提供服务的集群故障),降级(服务提供者停掉,消费者服务依然不受影响)
- feign = ribbon + restTemplate= 负载均衡 + 远程网络请求
- feign是声明式的web service客户端,它让微服务之间的调用变得更简单了,类似controller调用service。Spring Cloud集成了Ribbon,Eureka和nacos,可在使用Feign时提供负载均衡的http客户端
实例演示:
项目:
SpringCloudNacosProvider(生产者),SpringCloudNacosProviderApi(生产者api),SpringCloudNacosConsumer(消费者)
pom配置
父类pom加入:
<properties>
<java.version>1.8</java.version>
<spring-boot.version>2.3.2.RELEASE</spring-boot.version>
<spring-cloud.version>Hoxton.SR8</spring-cloud.version>
<nacos.version>2.2.5.RELEASE</nacos.version>
</properties>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${nacos.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
SpringCloudNacosProvider(生产者)pom加入:
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- 引入SpringCloudNacosProviderApi -->
<dependency>
<groupId>public</groupId>
<artifactId>SpringCloudNacosProviderApi</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
SpringCloudNacosProviderApi(生产者api)pom加入:
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
SpringCloudNacosConsumer(消费者)pom加入:
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- 引入SpringCloudNacosProviderApi -->
<dependency>
<groupId>public</groupId>
<artifactId>SpringCloudNacosProviderApi</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
项目配置
SpringCloudNacosProvider(生产者)
1.配置文件
server:
port: 9527
spring:
application:
name: nacos-provider
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
2.启动类
package com.nacos.provider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
//开启服务注册发现功能
@EnableDiscoveryClient
public class NacosProviderApplication {
public static void main(String[] args) {
SpringApplication.run(NacosProviderApplication.class);
}
}
3.测试controller
package com.nacos.provider.interfaces.facade;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Slf4j
public class ProviderTestController {
//test
@RequestMapping(value = "/helloNacos", method = RequestMethod.GET)
public String dataListLabel() {
log.info("[LabelController]-[dataListLabel]-[/data/list/label:begin]-[request]");
return "hello nacos";
}
}
SpringCloudNacosProviderApi(生产者api)
1.feign的api类
package com.nacos.provider.api.client;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@FeignClient(name = "nacos-provider")
public interface ProviderTestApi {
//test
@RequestMapping(value = "/helloNacos", method = RequestMethod.GET)
public String dataListLabel();
}
SpringCloudNacosConsumer(消费者)
1.配置文件
server:
port: 9528
spring:
application:
name: nacos-consumer
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
#### feign
feign:
client:
config:
default:
connectTimeout: 20000
readTimeout: 20000
httpclient:
connection-timeout: 20000
connection-timer-repeat: 20000
enabled: true
max-connections: 200
max-connections-per-route: 50
2.启动类
package com.nacos.consumer;
import com.nacos.provider.api.client.ProviderTestApi;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
//开启服务注册发现功能
@EnableDiscoveryClient
//开启feign调用功能
@EnableFeignClients(basePackages = {"com.nacos.provider.api"})
public class NacosConsumerApplication implements CommandLineRunner {
public static void main(String[] args) {
SpringApplication.run(NacosConsumerApplication.class);
}
//httpclient(根feign无关)
@Autowired
private RestTemplate restTemplate;
//httpclient(根feign无关)
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
//feign调用生产者api
@Autowired
private ProviderTestApi providerTestApi;
@Override
public void run(String... args) throws Exception {
//httpclient调用
// String forObject = restTemplate.getForObject("http://nacos-provide/helloNacos", String.class);
// System.out.println(forObject);
//feign调用
String forObject = providerTestApi.dataListLabel();
System.out.println(forObject);
}
}
测试
- 启动nacos
- 启动SpringCloudNacosProvider(生产者)
- 启动SpringCloudNacosConsumer(消费者)
日志显示:hello nacos ,说明调用生产者成功
总结
- SpringCloudNacosConsumer(消费者)和SpringCloudNacosProviderApi(生产者api),引入feign的包,
- SpringCloudNacosProviderApi(生产者api)的clientapi接口类使用@feign注解,
- SpringCloudNacosConsumer(消费者)启动类使用@EnableFeignClients 注解,开启feign调用功能。
- 将SpringCloudNacosConsumer(消费者)的引入SpringCloudNacosProviderApi(生产者api)的jar
- 就可以让SpringCloudNacosConsumer(消费者)通过SpringCloudNacosProviderApi(生产者api)的clientapi接口类调用SpringCloudNacosProvider(生产者)的接口