springcloudはサービスの登録と検出にnacosを使用します

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

おすすめ

転載: blog.csdn.net/m0_54850604/article/details/123684660