目次
ナコス
Nacos をダウンロードして実行します
まず、対応するリリース パッケージをダウンロードし、主にパッケージ化されコンパイルされた nacos-server ファイルを選択します。
https://github.com/alibaba/nacos/releases/tag/1.4.1
中国語のパスを含まない任意のフォルダーに解凍し、「
bin」と入力し、このフォルダーでコマンド ラインを開き、「startup.cmd -m standalone
nacos サーバー」を起動します。
デフォルトのサーバー ポートは 8848 です。上記の手順は、standalone
単一ボディの非クラスター モードで表現されています。
コマンド ラインが実行されるまでしばらく待った後、nacos から指定された URL を入力します。http://192.168.113.1:8848/nacos/index.html
これは管理インターフェイスであることがわかります。ユーザー名とパスワードは両方ともデフォルトです。nacos
ログインするだけです。
ナコスの構成
現在のプロジェクト設定は親子タイプであるため、最初に親プロジェクト pom に alibaba ツール ライブラリをインポートする必要があります。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
次に、nacos-discovery の依存関係をそれぞれのサーバーにインポートします。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
とてもシンプルですよね?
最後に、構成ファイルに nacos サーバーのアドレスを設定するだけで済みます。eureka とは異なり
、ここでの登録センターは実際には先ほど実行した nacos サーバーであるため、サーバーを実行するために追加のプロジェクトを作成する必要はありません。
設定ファイルの書き込みapplication.yaml
:
spring:
cloud:
nacos:
server-addr: localhost:8848
対応するモジュールをリビルドする
nacos コントロール パネルに戻ると、生成したサーバーが表示されます。
ナコスクラスター
個々のインスタンスがグループ化されてクラスターを形成します
クラスターは災害復旧メカニズムによく使用されます。
同じクラスター内のインスタンスは、まず現在のクラスター内の他のローカル インスタンスにアクセスし、他に方法がない場合は、他のクラスター内のインスタンスにアクセスします。
インスタンスのクラスターのセットアップは非常に簡単で、構成ファイルに次のコードを追加してクラスターに分類するだけです。
spring:
cloud:
nacos:
server-addr: localhost:8848
# 设置集群名称,将这个实例归为集群SH管理
discovery:
cluster-name: SH
Nacos ロード バランシング
現在次のような状況があるとします。
- サービスプロバイダーには 3 つのインスタンス、2 つのクラスター (BJ、NJ) があります。
- サービスコンシューマにはインスタンスとクラスタ (BJ) が 1 つだけあります。
コンシューマのクラスタはプロバイダのクラスタと一致していることがわかります。そのため、常識的には、コンシューマが同じクラスタ内のプロバイダからデータを直接取得することが期待されます。
ただし、nacos はデフォルトでポーリングを使用して負荷分散を実現するため、最終的な効果を得るにはデフォルト設定を変更する必要があります。
オプション 1: applcation.yaml でリボンを構成し、負荷分散方法を指定します。
service-consumer:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
オプション 2: インジェクションを使用してエントリー クラスで構成する
@Bean
NacosRule nacosRule() {
return new NacosRule();
}
負荷分散重み値の設定
- インスタンスの重みが 0 の場合、アクセスされません。
- 重量値の範囲 0 ~ 1
- 同じクラスター内の複数のインスタンスの中で、より高い重みを持つインスタンスがより頻繁にアクセスされます。
ナコス環境の分離
nacos は環境分離オプションを提供しており、
外部から内部まで、大規模な環境から小規模な環境まで次のようになります。命名空间->分组->服务->实例
まず、nacosコントロールパネルの「名前空間」モジュールに移動して、dev
任意の名前の名前空間を追加し、自動生成されたIDをコピーしましょう。
任意のサーバーの構成ファイルを検索し、名前空間フィールドを使用してサーバーを特定の名前空間に分類します。
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: BJ
# 设置改服务器所处的命名空间
# 这里需要填入我们之前记下来的命名空间ID
namespace: 1688ddc5-4f48-4bdc-bb5b-8c5363edf242
設定が完了したら、サーバーを再起動します
nacos コンソールに入り服务管理->服务列表
、上のナビゲーション バーをクリックして名前空間を切り替えます。
下の図では、新しく作成した dev 名前空間に切り替えており、構成したユーザーサーバーがこの名前空間によって管理されていることがわかります。
ナコスの登録詳細
サーバープロバイダーは、レジストリに登録するときに 2 つの状態から選択できます。
- 一時的なインスタンスのステータス
- 非一時的なインスタンスのステータス
一時インスタンスは、定期的なハートビート パケットを登録センターに積極的に送信して、その存在を証明する必要があります。そうしないと、タイムアウト後に登録センターから削除されます。
一時的ではないインスタンスは積極的にパッケージを送信する必要はありませんが、登録センターによって生存しているかどうかが確認され、永久に保持され、タイムアウトなどの理由で削除されることはありません。
nacos クラスターはデフォルトで AP モードを使用し、一時的ではないインスタンスがある場合は CP モードに切り替えます。
構成ファイル内のフィールドを使用して、ephemeral
サーバーが一時インスタンスであるかどうかをマークします。
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: BJ
namespace: 1688ddc5-4f48-4bdc-bb5b-8c5363edf242
# 设置是否为临时实例
ephemeral: false
Nacos のその他の構成アイテム
すぐに始めましょう
nacos はクラウド設定の設定ファイルを提供しているので、nacos で新しい設定ファイルを作成し、ホットアップデートが必要な設定項目を記述し、springboot アプリケーションの bootstrap.yaml でその設定を呼び出すだけです。
新しい設定ファイルを作成します。設定ファイル ID の記述形式は次のとおりです。<服务器名>-<类型>.yaml
現在の設定ファイルは、yaml 形式とプロパティ形式をサポートしています。
ここでの「サーバー名」は、この構成項目を有効にする前に、springboot のアプリケーションで定義された名前とまったく同じである必要があります。
nacos-config 依存関係を user-server に追加して依存関係を有効にします
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
nacos-config を追加した後、リソースフォルダーに新しい設定ファイルを作成しますがbootstrap.yaml
、このとき springboot 起動時に設定ファイルが先に読み込まれ、その後に設定ファイルが読み込まれます。application.yaml
spring:
# 服务器名称
application:
name: userservice
# 服务器类型(我们之前定义为dev,这里必须写dev)
profiles:
active: dev
# 其他关键性配置
cloud:
nacos:
server-addr: localhost:8848
config:
# 设置bootstrap配置文件的后缀名
file-extension: yaml
discovery:
cluster-name: BJ
namespace: 1688ddc5-4f48-4bdc-bb5b-8c5363edf242
ephemeral: false
次に、UserController.java
設定ファイルの情報を取得します。
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
@Value("${pattern.dataformat}")
private String dataFormat;
@GetMapping("/now")
public String now() {
// 由于我们之前在nacos中设置的配置项配置了pattern属性,这里就可以直接调用对应的属性完成时间格式化了
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dataFormat));
}
}
自動更新
nacos で構成ファイルを直接使用する利点は、プロジェクトで設定したapplication.yaml
後に再起動する必要がなく、ホット アップデートをリアルタイムで実装できることです。
nacos 設定ファイルを使用して Bean にアノテーションを追加するだけです@RefreshScope
。
@Slf4j
@RestController
@RequestMapping("/user")
@RefreshScope // 添加检测配置文件更新的注解
public class UserController {
}
または、カスタム構成クラスを作成して、指定された構成を動的に取得することもできます。
@Component
@Data
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
private String dataFormat;
}
動作環境 (dev など) を指定する構成ファイルを具体的に構成することuserservice-dev.yaml
も、サーバーのグローバル (すべての環境に共通) 構成ファイルを定義することもできます。userservice.yaml
設定ファイル間の優先順位: 環境パラメータを含む設定ファイル > グローバル設定ファイル > application.yaml
ふりをする
RestTemplate を置き換えます
resttemplate の非効率的な文字列のスプライシングと比較して、feign はインターフェイス操作の形式を提供し、対応するサーバー プロバイダーにより直観的に接続できるようにします。
まず依存関係を導入します
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
エントリークラスでfeignクライアントを有効にすることを忘れないでください。
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
@EnableFeignClients // 开启feign客户端
public class OrderApplication {
}
サーバープロバイダーのインターフェースを取得するインターフェースクラスを作成します。
コードリスト:clients/UserClient.java
// 注解内填入需要链接到的服务器名称
@FeignClient("userservice")
public interface UserClient {
// 表示使用GET请求获取数据
@GetMapping("/user/{id}")
// 同理PathVariable用来填补上方路径中的id占位符
User findById(@PathVariable("id") Long id);
}
最後にサービス内のクエリロジックを書き換えます。
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private UserClient userClient;
public Order queryOrderById(Long orderId) {
// 查询订单
Order order = orderMapper.findById(orderId);
// feign客户端请求user数据库中内容
User user = userClient.findById(order.getUserId());
order.setUser(user);
return order;
}
}
orderservice を実行した後、ブラウザに入力して
http://localhost:10087/order/101
対応するデータを取得します。実際、表示される効果はresttemplateとほぼ同じです
カスタム構成を装う
ログ出力レベルの構成
グローバル構成
feign:
client:
config:
default:
loggerLevel: FULL
ローカル構成 (サーバー名を明示的に指定)
feign:
client:
config:
userservice:
loggerLevel: FULL
またはコードで記述することもできます
パフォーマンスの最適化
URLConnection 接続プールを使用して元の単一リンクを置き換えると、偽クライアントの効率が向上します。
feign-httpclient 座標をインポートする
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
次に、構成ファイルでプロパティを構成します
feign:
client:
config:
default:
# 日志级别最好使用BASIC或者NONE,其他的级别比较耗费性能而且基本用不上
loggerLevel: BASIC
httpclient:
enabled: true
max-connections: 200
max-connections-per-route: 50