[SpringCloud] マイクロサービス テクノロジー スタック 2 の紹介 - Nacos Framework と Feign

ナコス

Nacos をダウンロードして実行します

まず、対応するリリース パッケージをダウンロードし、主にパッケージ化されコンパイルされた nacos-server ファイルを選択します。
https://github.com/alibaba/nacos/releases/tag/1.4.1

中国語のパスを含まない任意のフォルダーに解凍し、「
bin」と入力し、このフォルダーでコマンド ラインを開き、「startup.cmd -m standalonenacos サーバー」を起動します。

デフォルトのサーバー ポートは 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 ロード バランシング

現在次のような状況があるとします。

  1. サービスプロバイダーには 3 つのインスタンス、2 つのクラスター (BJ、NJ) があります。
  2. サービスコンシューマにはインスタンスとクラスタ (BJ) が 1 つだけあります。

コンシューマのクラスタはプロバイダのクラスタと一致していることがわかります。そのため、常識的には、コンシューマが同じクラスタ内のプロバイダからデータを直接取得することが期待されます。


ただし、nacos はデフォルトでポーリングを使用して負荷分散を実現するため、最終的な効果を得るにはデフォルト設定を変更する必要があります。

オプション 1: applcation.yaml でリボンを構成し、負荷分散方法を指定します。

service-consumer:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule

オプション 2: インジェクションを使用してエントリー クラスで構成する

@Bean
NacosRule nacosRule() {
    
    
    return new NacosRule();
}

負荷分散重み値の設定

  1. インスタンスの重みが 0 の場合、アクセスされません。
  2. 重量値の範囲 0 ~ 1
  3. 同じクラスター内の複数のインスタンスの中で、より高い重みを持つインスタンスがより頻繁にアクセスされます。

ナコス環境の分離

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 つの状態から選択できます。

  1. 一時的なインスタンスのステータス
  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

おすすめ

転載: blog.csdn.net/delete_you/article/details/132941516