spring-cloud-alibabaのオープンソース以来、springcloudでnacosを使用するサービスの登録と検出が非常に簡単になりました。「spring-cloud-starter-alibaba-nacos-discovery」を導入してから、@EnableDiscoveryClientを開くだけです。 eurekaやconsulなどのレジストリをシームレスに置き換えます。
以下は、簡単なケースを挙げて、springcloudでnacosを使用する方法を示しています。
nacos-discovery-staterの原則
まず、springcloudのnacosでのサービスの登録と検出の原則を見てみましょう。
サービス登録
spring-cloud-starter-alibaba-nacos-discoveryは、spring-cloud-common標準に準拠し、AutoServiceRegistration、ServiceRegistry、およびRegistrationの3つのインターフェースを実装します。
springcloudアプリケーションの起動フェーズでは、WebServerInitializedEventイベントが監視されます。Webコンテナが初期化されると、つまりWebServerInitializedEventイベントを受信した後、登録アクションがトリガーされ、ServiceRegistryのregisterメソッドが呼び出されて登録されます。 Nacosサーバーへのサービス。
サービスディスカバリ
NacosServerListは、com.netflix.loadbalancer.ServerListインターフェースを実装し、@ ConditionOnMissingBeanの条件で自動インジェクションを実行し、デフォルトでリボンを統合します。
よりカスタマイズされたインスタンスが必要な場合は、@ Autowiredを使用してNacosRegistrationインスタンスを挿入し、保持しているNamingServiceフィールドのコンテンツを介してNacosAPIを直接呼び出すことができます。
nacos-service-provider
サービスプロバイダーのspringcloudプロジェクトを作成し、次の依存関係を導入します。
<properties>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
<spring-cloud.alibaba.version>0.2.1.RELEASE</spring-cloud.alibaba.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.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
プロジェクトのapplication.ymlファイルでnacosに関連する構成情報を次のように構成します。
Nacosをサービスの登録と検出として使用したくない場合は、spring.cloud.nacos.discoveryをfalseに設定できます。
spring:
application:
name: nacos-service-provider
cloud:
nacos:
discovery:
register-enabled: true
server-addr: 127.0.0.1:8848
weight: 1
namespace: dev
management:
endpoints:
web:
exposure:
include: "*"
server:
port: 8080
次のステップは、呼び出し元が使用するサービスを作成することです。メイン関数に@EnableDiscoveryClientアノテーションを導入することを忘れないでください。
package com.lazycece.scac.nacos.discovery.provider.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author lazycece
* @date 2019/03/19
*/
@RestController
@RequestMapping("/nacos")
public class NacosProviderController {
@GetMapping("/provider/{name}")
public String provider(@PathVariable String name) {
return "hello," + name;
}
}
nacos-service-consumer
サービスコンシューマー向けのspringcloudプロジェクトを作成し、次の依存関係を導入します。ここでは、open-feignとribbonの依存関係を紹介して、これら2つのメソッドを同時に使用する方法を示します。
<properties>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
<spring-cloud.alibaba.version>0.2.1.RELEASE</spring-cloud.alibaba.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.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
プロジェクトのapplication.ymlファイルでnacosに関連する構成情報を次のように構成します。
サービスの登録と検出にNacosを使用したくない場合は、spring.cloud.nacos.discoveryをfalseに設定できます。
spring:
application:
name: nacos-service-consumer
cloud:
nacos:
discovery:
register-enabled: true
server-addr: 127.0.0.1:8848
weight: 1
namespace: dev
management:
endpoints:
web:
exposure:
include: "*"
server:
port: 8081
サービスコンシューマーを作成するコードは次のとおりです。メイン関数に@EnableDiscoveryClientアノテーションを導入することを忘れないでください。
package com.lazycece.scac.nacos.discovery.consumer.controller;
import com.lazycece.scac.nacos.discovery.consumer.api.FeignConsumerApi;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* @author lazycece
* @date 2019/03/19
*/
@RestController
@RequestMapping("/nacos/consumer")
public class NacosConsumerController {
private LoadBalancerClient loadBalancerClient;
private RestTemplate restTemplate;
private FeignConsumerApi feignConsumerApi;
@Autowired
public NacosConsumerController(LoadBalancerClient loadBalancerClient, RestTemplate restTemplate,
FeignConsumerApi feignConsumerApi) {
this.loadBalancerClient = loadBalancerClient;
this.restTemplate = restTemplate;
this.feignConsumerApi = feignConsumerApi;
}
@GetMapping("/rest/{name}")
public String rest(@PathVariable String name) {
ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-service-provider");
String url = String.format("http://%s:%s/nacos/provider/%s",
serviceInstance.getHost(), serviceInstance.getPort(), name);
System.out.println("url -> " + url);
return restTemplate.getForObject(url, String.class);
}
@GetMapping("/feign/{name}")
public String feign(@PathVariable String name) {
return feignConsumerApi.provider(name);
}
@GetMapping("/ribbon/{name}")
public String ribbon(@PathVariable String name) {
return restTemplate.getForObject("http://nacos-service-provider/nacos/provider/" +
name, String.class);
}
}
レストモードで使用するには、RestTemplateを挿入する必要があります。負荷分散にリボンを使用する必要がある場合は、@ LoadBalancedで注釈を付けることができます。それ以外の場合は、追加できません。
package com.lazycece.scac.nacos.discovery.consumer.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
* @author lazycece
* @date 2019/03/19
*/
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
フェイグモードで使用するには、次のようにフェイグクライアントが必要です。また、プロジェクトのメイン関数で@EnableFeignClients
アノテーションを導入する必要があります。
package com.lazycece.scac.nacos.discovery.consumer.api;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author lazycece
* @date 2019/03/19
*/
@FeignClient("nacos-service-provider")
@RequestMapping("/nacos")
public interface FeignConsumerApi {
@GetMapping("/provider/{name}")
String provider(@PathVariable String name);
}
サービス登録とディスカバリーケースの検証
最初にnacos-serverサービスを開始する必要があります。インストールと展開については、nacosのインストールと展開を参照してください。
サービスエンドポイント
spring-cloud-starter-alibaba-nacos-discoveryは、実装時にEndPointを提供し、EndPointのアクセスアドレスはhttp:// ip:port / actuator/nacos-discoveryです。spring-boot-starter-actuator依存関係を追加したため、エンドポイント情報を表示できます。EndPoint情報には主に2つのタイプがあります。
- サブスクライブ:現在どのサービスサブスクライバーであるかを示します
- NacosDiscoveryProperties:Nacosに関する現在のサービスインスタンスの基本構成を表示します
EndPointにアクセスするサービスインスタンスの1つの情報は次のとおりです。
{
"subscribe":[
],
"NacosDiscoveryProperties":{
"serverAddr":"127.0.0.1:8848",
"endpoint":"",
"namespace":"dev",
"logName":"",
"service":"nacos-service-provider",
"weight":1,
"clusterName":"DEFAULT",
"namingLoadCacheAtStart":"false",
"metadata":{
},
"registerEnabled":true,
"ip":"192.168.3.8",
"networkInterface":"",
"port":8080,
"secure":false,
"accessKey":"",
"secretKey":""
}
}
nacosチューブインターフェース
http:// localhost:8848 / nacos /にアクセスしてnacosの管理インターフェイスに入り、[ Service Management]-> [Service List]モジュールを確認すると、次の図に示すように、サービスコンシューマーとプロバイダーがnacosに登録されていることがわかります。 :
サービス消費
ここでは、最初にnacosサービスを開始してから、上記の2つのサービスを開始し、次のアドレスにアクセスする必要があります
。
リボン/lazycecehttp
:// localhost:8081 / nacos / Consumer / feign / lazycece
出力情報:こんにちは、lazycece
Springcloudnacosの詳細情報
spring-cloud-starter-alibaba-nacos-discoveryに関するその他の構成情報を次の図に示します。
ケースのソースコード
ケースのソースアドレス:
https ://github.com/lazycece/springcloud-actual-combat/tree/master/springcloud-ac-alibaba/springcloud-ac-alibaba-nacos-discovery