Javaのアーキテクチャの道 - (マイクロサービスフォーカス)ナコスクラスタ簡潔戦闘

最終更新日:

  最後のブログは、我々は主要なマイクロ開発サービスおよびビルドスタンドアロン、開始するための単一-mスタンドアロン必要にナコスクラスタと言う、クラスタは、高可用性ngxin何か、自信とMySQLを実行するためにnginxのリバースプロキシを使用することをお勧めします。

ポジショニング:

  インテリアコンセプトナコスA、

  第二に、ナコスの基本的な使用

  第三には、次のリボンアセンブリのための準備します

インテリアコンセプトナコス

  我々はちょうど我々が唯一の登録最後の時間は、それが私たちのナコスにどのようにサービスに来るときということに基づいていきますが、コールは私たちが言うには、様々な通話と言っていないことを良いナコスクラスタ、クラスタを構築する最後の時間それ(負荷分散アルゴリズムが言ってリボンと呼ばれます)。

  ①。コール、聞かせてのは、コールオーダーシステム、チェック受注にシンプル、ユーザシステムを呼び出します。

   レジストリの設定を追加して、二つのプロジェクトをビルドしSpringboot。最後のブログを設定すると、ここではそれらを繰り返すと、注文サービスのメソッドを記述していない、と述べました。

@RestController
 パブリック クラスOrderController { 

    (@GetMapping "/ getOrderDataを" パブリック文字列getOrderData(){
         戻り "取得したサービスオーダデータ" ; 
    } 


    (@GetMapping "/ getOrderDataBを" パブリック文字列getOrderDataB(){
         戻り得られた「受注サービスデータB " ; 
    } 
}

  私はシンプルを書いた、とも呼び出すことができます文字列の場合は、以下の記述を得ることができます。

  顧客サービス、書き込みconfig設定で。

@Configuration
 パブリック クラスクライアントコンフィグ{ 

    @Bean 
    公共残留テンプレートの残りのテンプレート(){
         返す 新しい休憩テンプレートを(); 
    } 
}

  友人を呼び出して起動します

@RestController
 パブリック クラスUserControllerで{ 

    @Autowired 
    プライベートRestTemplate restTemplate。

    @Autowired 
    プライベートDiscoveryClient discoveryClient。

    @GetMapping( "/ getOrder" パブリック文字列getOrderData(){ 
        リスト <ServiceInstance> ORDERINFO = discoveryClient.getInstances( "ナコス順序" )。
        もしヌル == ORDERINFO || orderInfo.isEmpty()){
             リターン "用户微服务没有对应的实例可用" 
        } 
      
        文字列targetUri = orderInfo.get(0 ).getUri()のtoString()。

        ストリングforObject = restTemplate.getForObject(targetUri + "/ getOrderData"、文字列。クラス)。
        System.out.println( "forObject =" + forObject)。

        返すforObjectを。
    } 
}

  このように、最も簡単な通話が実現されます。(無負荷分散アルゴリズムは、私が直接)(0を取得していません)。

  ②.namespace

  ここでは、我々はインターフェイスに対処しなければならない、我々が開発している場合は、テスト環境はナコスを共有し、どのような名前空間を見て異なっている、とあなたは、開発プロセスであり、それは自由に設定可能なテスト環境を推奨されていない、我々は、名前空間を使用する必要があります私たちのスペースを分離します。

  私たちのナコスページを開き、名前空間をクリックして、新しい、あなたができる情報を入力します。

   分離を実現する方法を、私たちが達成するために、コードを見てみましょう。

  まず、設定ファイルで設定名前空間を追加します。名前空間:名前空間のID

spring:
  application:
    name: nacos-order
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.138.119:8848
        namespace: 0610f97e-c25d-4f49-bfb8-b340e3584b82
server:
  port: 8888

   订单服务的配置为开发环境,用户服务配置为测试环境的,我们来运行一下代码,理论上应该调用不通的,我们来看一下结果。

  现实如此无法调用,也就做到了我们的隔离环境。如果不写namespace,默认是public命名空间。

  ③.group

  group分组,也是用来隔离的,打个比方啊,加入我们的用户服务,订单服务,仓储服务和物流服务四个服务,订单服务中有一个接口叫getData,仓储服务中也有一个接口叫getData,我们的用户服务只想调用到我们的订单服务的getData,不想调用到仓储服务的getData,这时我们可以用group分组来隔离。

   我们来看一下配置吧。只需要加入group:分组名称即可,nacos客户端不需要任何设置,这里需要注意的是你的父类项目依赖,2.1.0.RELEASE版本是没有group的,也无法设置group(反正我没找到什么好办法)。需要改配置为2.1.1.RELEASE

<!--spring cloud alibaba依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2.1.1.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
spring:
  application:
    name: nacos-order
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.138.119:8848
        namespace: 0610f97e-c25d-4f49-bfb8-b340e3584b82
        group: pay
server:
  port: 8888

  ④.还有一个概念是service服务集群,什么意思呢?先上个图。

   就是什么呢,我们现在有两组集群,一个是北京的订单服务集群,一个是北京的用户服务集群,还有一个上海的订单服务集群,我们希望北京的用户集群,优先去调用北京的订单系统,上海的优先调用上海的集群服务。并不希望我们跨地区远程调用(如果组内实在没有服务了,也可以调用,但是优先考虑同一集群的)。配置文件如下所示

spring:
  application:
    name: nacos-order
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.138.119:8848
        namespace: 0610f97e-c25d-4f49-bfb8-b340e3584b82
        group: pay
        cluster-name: BJ-cluster
server:
  port: 8888

  ⑤.再就是版本了,也是我知道的最后一个了,比如我们要进行灰度发布了,我们有100台服务集群,但是这次新功能很重要,不能一次性全部更新,我们选择灰度发布,我们选出5台服务作为新版发布的,我们定义为V2,内部接口时不兼容的,所以我们只能要5台新用户服务去调用5台订单服务,原有的95台用户服务还是继续调用那95台订单服务,我们定义为V1。

  我们来看一下代码配置

spring:
  application:
    name: nacos-order
  cloud:
    nacos:

      discovery:
        server-addr: 192.168.138.119:8848
        namespace: 0610f97e-c25d-4f49-bfb8-b340e3584b82
        group: namespace-one
        cluster-name: BJ-cluster
        metadata:
          version: v1
server:
  port: 8888

  剧透一下,nacos是用map来进行隔离的,大致结构式Map<namespace,Map<group::serviceName,Service>>,也是我们为什么cluster-name和版本为什么做不到完全隔离,后面的源码博客会说详细说这个问题的。

总结:

  这次我们主要说了nacos的使用,原理?原理还没说,等到我们的源码带着说一下吧,不难,就是一个心跳的问题。nacos要知道namespace、group、cluster-name、版本主要是用来做什么的,什么时候我们该选择什么。下次我们来说一下Ribbon,也就是我们服务直接调用的一个插件。

 

最进弄了一个公众号,小菜技术,欢迎大家的加入

おすすめ

転載: www.cnblogs.com/cxiaocai/p/12283412.html