0
点赞
收藏
分享

微信扫一扫

SpringCloud Alibaba 2021.0.1.X(二) 服务发现 nacos2.X 多客户端实现(LoadBalancer,WebFlux,RestTemplate,Feign)

完整项目推荐: 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;
    }
}
举报

相关推荐

0 条评论