概観
Nacosを介して登録済みのサービスを利用する場合、消費者はRestTemplate、WebClient、Feignなどのメソッドを使用できますが、それらの違いは何ですか?
RestTemplateを使用する
RestTemplateは、サービスの特定のインスタンスへのHTTP要求を開始しますが、特定の要求パスはスプライシングによって完了します。これは、開発経験には適していません。ただし、実際には、RestTemplateはSpring Cloudで拡張されており、前の呼び出しメソッドを簡略化するために必要な構成はわずかです。
@EnableDiscoveryClient
@SpringBootApplication
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
@Slf4j
@RestController
static class TestController {
@Autowired
RestTemplate restTemplate;
@GetMapping("/test")
public String test() {
String result = restTemplate.getForObject("http://alibaba-nacos-discovery-server/hello?name=didi", String.class);
return "Return : " + result;
}
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
RestTemplateを定義すると、@ LoadBalancedアノテーションが追加され、サービスインターフェイスが実際に呼び出されると、元のホストパーツが手動でスプライスされたIPとポートになり、サービス名を直接使用するとリクエストパスを書き込むことができます。
@ LoadBalanced:はい登録センターを介してサービスプロバイダーのアプリケーション名を取得し、ロードバランサーを介してノードを選択し、サービス名の部分を特定のIPおよびポートに置き換えて、サービス名に基づくロードバランシングコールを実現します。
WebClientを使用する
WebClientはSpring 5の最新の紹介であり、RestTemplateの反応バージョンとして理解できます。以下は、上記のRestTemplateと同じリクエスト呼び出しを実装する特定の例です。
@EnableDiscoveryClient
@SpringBootApplication
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
@Slf4j
@RestController
static class TestController {
@Autowired
private WebClient.Builder webClientBuilder;
@GetMapping("/test")
public Mono<String> test() {
Mono<String> result = webClientBuilder.build()
.get()
.uri("http://alibaba-nacos-discovery-server/hello?name=didi")
.retrieve()
.bodyToMono(String.class);
return result;
}
}
@Bean
@LoadBalanced
public WebClient.Builder loadBalancedWebClientBuilder() {
return WebClient.builder();
}
}
定義中に注釈WebClient.Builder
が追加され、@LoadBalanced
原則は以前のRestTemplateと同じです。
Feignを使用する
最初のステップ:pom.xmlのopenfeignの依存関係を増やします:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
ステップ2:Feignクライアントを定義し、Feignクライアントを使用します。
@EnableDiscoveryClient
@SpringBootApplication
@EnableFeignClients //开启扫描Spring Cloud Feign客户端的功能
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
@Slf4j
@RestController
static class TestController {
@Autowired
Client client;
@GetMapping("/test")
public String test() {
String result = client.hello("didi");
return "Return : " + result;
}
}
@FeignClient("alibaba-nacos-discovery-server") //指定这个接口所要调用的服务名称,接口中定义的各个函数使用Spring MVC的注解就可以来绑定服务提供方的REST接口
interface Client {
@GetMapping("/hello")
String hello(@RequestParam(name = "name") String name);
}
}
注:文章引用