目次
2.5.2nacos-consumerプロジェクトにpom依存関係を追加する
2.5.3 bootstrap.yml(application.ymlファイルではなくbootstrap.ymlファイルである必要があります)ファイルで以下を構成します。
2.5.5 RestControllerを作成し、@ RefreshScopeをコントローラーに追加して、構成のホットロードを実装します。コードは次のように表示されます。
1.サービスディスカバリー
1.1マイクロサービスの機能
- サービス層は、ビジネスごとにマイクロサービスに分割されます。
- マイクロサービスの責任は単一です。
- マイクロサービス間の伝送には、RESTfulやRPCなどの軽量プロトコルが使用されます。
- フロントエンドとバックエンドの分離アーキテクチャの使用に役立ちます。
1.2サービス発見の事例
1.2.1概要
マイクロサービスアーキテクチャでは、システム全体がその責任と能力に応じて複数のサービスに分割され、サービス間のコラボレーションによってビジネス目標が達成されます。このように、コード内のサービス間でリモート呼び出しを行うことは避けられません。サービスの消費者はサービスのプロデューサーに電話をかける必要があります。要求を完了するには、消費者はサービスプロデューサーのネットワークの場所(IPアドレスとポート番号)を知っている必要があります。
このコードは、次のように構成ファイルを読み取ることにより、サービスプロデューサーのネットワークロケーションを読み取ることができます。
1.2.2nacosサービスの構築
1.2.3プロジェクトの作成
親プロジェクトpom、xml
<modules>
<module>nacos-provider</module>
<module>nacos-consumer</module>
</modules>
<name>nacos</name>
<description>Demo project for Spring Boot</description>
<packaging>pom</packaging>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
nacos-プロバイダーpom.xml
<name>nacos-provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</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.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
nacos-上記と同じconsumerpom.xml
application.ymlはどちらも同じです。appicatiion.nameサービス名とserver.portプロジェクトポートを変更してください
server:
port: 56020
spring:
application:
name: nacos-rest-consumer
cloud:
nacos:
discovery:
server-addr: nacosIp:nacosPort # 默认端口8848
サービスコンシューマーコントローラー
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
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.RestController;
import org.springframework.web.client.RestTemplate;
import java.net.URI;
/**
* @author yd
* @version 1.0
* @date 2020/9/27 11:23
*/
@RestController
public class RestConsumerController {
/**
* 服务id即注册中心的中的服务名
*/
private String serviceId = "nacos-provider";
@Autowired
LoadBalancerClient loadBalancerClient;
@GetMapping(value = "/service")
public String service() {
RestTemplate restTemplate = new RestTemplate();
ServiceInstance serviceInstance = loadBalancerClient.choose(serviceId);
URI uri = serviceInstance.getUri();
String forObject = restTemplate.getForObject(uri+"/service", String.class);
return "consumerinvoke" + forObject;
}
}
RestProviderController
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author yd
* @version 1.0
* @date 2020/9/27 11:16
*/
@RestController
public class RestProviderController {
/**
* 暴露服务
* @return
*/
@GetMapping(value = "/service")
public String service() {
System.out.println("provider invoke");
return "provider invoke";
}
}
1.2.4アクセスを開始する
2.構成センター
2.1概要
多くの場合、アプリケーションは起動および実行時にいくつかの構成情報を読み取る必要があります。構成は基本的に、データベース接続パラメーター、起動パラメーターなど、アプリケーションのライフサイクル全体に付随します。
マイクロサービスアーキテクチャでは、システムを単一のアプリケーションから分散システム上のサービスノードに分割する場合、構成ファイルも移行(分割)して、構成を分散させる必要があります。これだけでなく、冗長性
2.2構成特性
- 構成アイテムは読みやすく、変更も簡単です
- 分散環境でのアプリケーション構成の管理性、つまり構成をリモートで管理する機能
- 構成変更の履歴を表示できます
- さまざまな展開環境でのアプリケーション構成の分離
2.3ncaosの利点
- 高い読み取りおよび書き込みパフォーマンス
- 独自の運用および保守管理インターフェイス
- アリババオープンソース
2.4構成管理モデル
Nacos構成管理の場合、構成セットは、名前空間、グループ、およびデータIDを介して見つけることができます。
- 名前空間:開発、テスト、実稼働環境など、さまざまな環境を表します。
- グループ:XX医療プロジェクト、XXeコマースプロジェクトなどのプロジェクトを表します
- DataId:多くの場合、各プロジェクトの下には複数のプロジェクトがあり、各構成セット(DataId)はプロジェクトのメイン構成ファイルです。
2.5構成センターのケース
2.5.1名前名を作成する
名前空間->新しい名前空間
新しい構成
例
common:
name: bushuangli--热加载
server:
port: 8089
2.5.2nacos-consumerプロジェクトにpom依存関係を追加する
<!--配置中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.5.3 bootstrap.yml(application.ymlファイルではなくbootstrap.ymlファイルである必要があります)ファイルで以下を構成します。
spring:
cloud:
nacos:
discovery:
server-addr: nacosip:nacosport
cluster-name: DEFAULT # 默认集群,可不填写
config:
file-extension: yaml #nacos选的配置格式
group: DEFAULT_GROUP # nacosgroup
namespace: 8ee806e0-6fa8-4842-a051-6f55df4972bc # nacos命名空间
server-addr: nacosip:nacosport
cluster-name: DEFAULT # 默认集群,可不填写
prefix: nacos-rest-consumer #prefix 默认为 spring.application.name 的值
2.5.4プロジェクトの構造
2.5.5 RestControllerを作成し、@ RefreshScopeをコントローラーに追加して、構成のホットロードを実装します。コードは次のように表示されます。
/**
* RefreshScope 配置热加载
* @author BSL
*/
@RestController
@RefreshScope
public class RestConsumerController {
/**
* 服务id即注册中心的中的服务名
*/
private String serviceId = "nacos-provider";
@Value("${common.name}")
private String common_name;
@GetMapping(value = "/configs")
public String getvalue(){
return common_name;
}
@Autowired
private ConfigurableApplicationContext applicationContext;
@GetMapping(value = "/configs2")
public String getvalue2(){
String common_name = applicationContext.getEnvironment().getProperty("common.name");
return common_name;
}
@Autowired
LoadBalancerClient loadBalancerClient;
@GetMapping(value = "/service")
public String service() {
RestTemplate restTemplate = new RestTemplate();
ServiceInstance serviceInstance = loadBalancerClient.choose(serviceId);
URI uri = serviceInstance.getUri();
String forObject = restTemplate.getForObject(uri+"/service", String.class);
return "consumerinvoke" + forObject;
}
}
2.5.6テスト
プロジェクトnacos-consumerを開始し、ブラウザーでlocalhost:8089 / configsにアクセスすると、nacosコンソールで構成されたcommon.nameに戻ることができます。nacos Webページでcommon.nameの構成を変更し、nacos-providerプロジェクトを再起動せずにlocalhost:8089 / configsに再度アクセスして、変更した値を返します。nacosが構成センターとしてホットリロード機能を実装していることがわかります。
2.5.7構成センターの拡張
NacosConfigを構成センターとしてSpringCloudを使用する場合、Nacosは、通常、次のような名前名を介して、複数の環境の構成管理をサポートします。
パブリック、開発、および同じ構成センターを使用する複数のプロジェクトグループまたはチーム、または異なるモジュール管理がある場合、グループは通常、公式ドキュメントで紹介されているNacos Configに関連する構成の詳細を区別するために使用され、それらを読むことができます。理解してください、https://github.com/spring-cloud-incubator/spring-cloud-alibaba/wiki/Nacos-config
複数の構成ファイルの使用をサポートする場合、bootstrap.ymlはext-configを使用する必要があります
新しい構成を作成する
bootstrap.yml
spring:
cloud:
nacos:
discovery:
server-addr: nacosip:nacosport
cluster-name: DEFAULT # 默认集群,可不填写
config:
server-addr: nacosip:nacosport
cluster-name: DEFAULT # 默认集群,可不填写
prefix: nacos-rest-consumer #prefix 默认为 spring.application.name 的值
file-extension: yaml #file-exetension 为配置内容的数据格式
namespace: 8ee806e0-6fa8-4842-a051-6f55df4972bc # nacose 命名空间id
ext-config:
- data-id: nacos-rest-consumer.yaml
group: DEFAULT_GROUP
- data-id: nacos-consumer-data-source.yaml # Nacos上配置集的ID,这里要注意的是这个 data-id一定要有后缀名
group: MYSQL # 自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP
refresh: true # 控制该 Data Id 在配置变更时,是否支持应用中可动态刷新, 感知到最新的配置值。默认是false,代表启动时获取一次
上記の場合、2つの拡張構成セットがそれぞれDEFAULT_GROUPグループとMYSQLグループに割り当てられるように構成されています。nacos-rest-consumer.yamlはリアルタイムで更新されません。ここで、nacos-consumer-data-source.yamlの優先度はnacos-rest-consumerよりも大きくなります。 yaml、優先度サイズの順序はextension-configs [n]であるため、nが大きいほど、優先度が高くなり、構成セットの構成値の優先度が高くなります。
- data-id:Nacosで設定された構成のID。このdata-idにはサフィックス名が必要であることに注意してください。
- group:カスタムデータIDが配置されているグループ。明示的に構成されていない場合、デフォルトはDEFAULT_GROUPです。
- 更新:構成が変更されたときにデータIDがアプリケーションで動的更新をサポートするかどうかを制御し、最新の構成値を認識します。デフォルトはfalseです。これは、起動時に1回取得することを意味します
コントローラ
@Value("${datasource2.root}")
private String root;
@GetMapping(value = "/configs3")
public String getvalue3(){
return root;
}