完整项目推荐: RuoYi-Cloud-Plus 微服务管理系统
项目结构
- Common 通过spring cloud common中的负载均衡接口选取服务提供节点实现接口调用
- WebFlux 通过 spring webflux 实现接口调用
- RestTemplate 通过 spring RestTemplate 实现接口调用
- Fegin 通过 spring openfeign 实现接口调用
创建客户端子工程
父工程 增加子工程模块管理
<module>alibaba-nacos-discovery-client</module><!-- 使用Nacos实现服务注册与发现:服务消费方 -->
子工程 pom.xml 文件
<parent>
<groupId>com.lionli</groupId>
<artifactId>spring-cloud-alibaba-demo</artifactId>
<version>2.0</version>
</parent>
<artifactId>alibaba-nacos-discovery-client</artifactId>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</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>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
配置文件
server:
port: 9000
spring:
application:
name: alibaba-nacos-discovery-client
cloud:
nacos:
discovery:
server-addr: localhost:8848
项目启动类
@EnableFeignClients //开启Feign客户端
@SpringBootApplication
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
}
编写测试类
(1) LoadBalancer 实现
@Slf4j
@RestController
public class CommonController {
@Autowired
private LoadBalancerClient loadBalancerClient;
@GetMapping("/testCommon")
public String testCommon() {
// 通过spring cloud common中的负载均衡接口选取服务提供节点实现接口调用
ServiceInstance serviceInstance = loadBalancerClient.choose("alibaba-nacos-discovery-server");
String url = serviceInstance.getUri() + "/test?name=common";
RestTemplate restTemplate = new RestTemplate();
String result = restTemplate.getForObject(url, String.class);
return "返回数据 : " + result;
}
}
(2) WebFlux 实现
配置类
@Configuration
public class WebFluxConfig {
@Bean
@LoadBalanced
public WebClient.Builder loadBalancedWebClientBuilder() {
return WebClient.builder();
}
}
测试类
@Slf4j
@RestController
public class WebFluxController {
@Autowired
private WebClient.Builder webClientBuilder;
@GetMapping("/testWebFlux")
public Mono<String> testWebFlux() {
Mono<String> result = webClientBuilder.build().get()
.uri("http://alibaba-nacos-discovery-server/test?name=webFlux")
.retrieve().bodyToMono(String.class);
return result;
}
}
(3) RestTemplate 实现
配置类
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
测试类
@Slf4j
@RestController
public class RestTemplateController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/testRest")
public String testRest() {
String result = restTemplate.getForObject("http://alibaba-nacos-discovery-server/test?name=restTemplate", String.class);
return "返回数据 : " + result;
}
}
(4) Feign 实现
接口类
@FeignClient(name = "alibaba-nacos-discovery-server")
public interface TestServiceFeign {
@GetMapping("/test")
String test(@RequestParam(name = "name") String name);
}
测试类
@Slf4j
@RestController
public class FeignController {
@Autowired
private TestServiceFeign testServiceFeign;
@GetMapping("/testFeign")
public String testFeign() {
String result = testServiceFeign.test("feign");
return "返回数据 : " + result;
}
}