1. 程式人生 > >SpringCloud使用Nacos服務發現實現遠程調用

SpringCloud使用Nacos服務發現實現遠程調用

frame https date control 創建 run ota led app

本文使用SpringCloud結合Nacos服務發現,Feign遠程調用做一個簡單的Demo。

1 Nacos

關於Nacos之前寫了兩篇文章關於SpringBoot對它的使用,感興趣可以查看一下。

《SpringBoot使用Nacos配置中心》

《SpringBoot使用Nacos服務發現》

在SpringBoot使用的時候,需要自行去向Nacos服務註冊自己的服務,Nacos也提供了SpringCloud服務發現的依賴,本文結合spring-cloud-starter-alibaba-nacos-discovery進行使用介紹。

本文使用版本為:

  • SpringCloud Finchley.SR2
  • SpringBoot 2.0.3.RELEASE
  • spring-cloud-starter-alibaba-nacos-discovery 0.2.1.RELEASE
  • spring-cloud-starter-openfeign 2.0.0.RELEASE

2.本文場景

兩個服務,如下:

  • springcloud-nacos-discovery-provider:端口號10000,服務提供者。
  • springcloud-nacos-discovery-consumer:端口號10001,服務消費者。

原理很簡單,瀏覽器訪問消費者,消費者調用服務提供者。

3.服務提供者

3.1 依賴配置

創建一個項目,項目中加入SpringCloud-Nacos依賴,完整pom如下所示。


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.dalaoyang</groupId>
    <artifactId>springcloud_nacos_discovery_provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springcloud_nacos_discory_provider</name>
    <description>springcloud_nacos_discovery_provider</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.SR2</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>0.2.1.RELEASE</version>
        </dependency>
    </dependencies>

    <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>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

3.2 啟動類

在啟動類加入@SpringBootApplication註解,完整啟動類代碼如下所示。

package com.dalaoyang;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class SpringcloudNacosDiscoveryProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringcloudNacosDiscoveryProviderApplication.class, args);
    }

}

3.3 配置文件

配置文件中配置Nacos服務地址,當前服務名,這裏需要註意一點,使用Ribbon負載均衡的時候服務名中不能使用下劃線,不然會找不到服務。

配置文件如下所示。

server.port=10000
spring.application.name=springcloud-nacos-discovery-provider
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

3.4 提供服務

創建一個Controller,提供一個方法進行測試,如下所示。

package com.dalaoyang.controller;

import org.springframework.web.bind.annotation.*;

/**
 * @author yangyang
 * @date 2019/2/4
 */
@RestController
public class TestController {

    @GetMapping("/test/{string}")
    public String test(@PathVariable String string) {
        return "Hello Nacos :" + string;
    }
}

4 服務消費者

4.1 依賴配置

與服務提供者類似,在服務消費者加入SpringCloud-Nacos依賴和OpenFeign依賴,完整pom入夏所示。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.dalaoyang</groupId>
    <artifactId>springcloud_nacos_discovery_consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springcloud_nacos_discovery_consumer</name>
    <description>springcloud_nacos_discovery_consumer</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.SR2</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>2.0.0.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>0.2.1.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <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>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

4.2 啟動類

在啟動類加入註解@EnableDiscoveryClient並且開啟負載均衡,如下所示。

package com.dalaoyang;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableDiscoveryClient
public class SpringcloudNacosDiscoveryConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringcloudNacosDiscoveryConsumerApplication.class, args);
    }

    @LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

}

4.3 配置文件

配置文件與提供者一致,只是服務名不同,如下所示。

server.port=10001
spring.application.name=springcloud-nacos-discovery-consumer
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

4.4 創建服務調用

創建一個Controller進行調用服務,如下所示。

package com.dalaoyang.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * @author yangyang
 * @date 2019/2/4
 */
@RestController
public class TestConrtroller {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("test/{string}")
    public String test(@PathVariable String string) {
        return restTemplate.getForObject("http://springcloud-nacos-discovery-provider/test/" + string, String.class);
    }
}

5 測試

分別啟動兩個服務,查看Nacos管理頁面,如圖所示。

技術分享圖片

點擊詳情可以查看服務的詳細信息,如端口號,權重等,如圖所示。

技術分享圖片

接下倆在瀏覽器訪問http://localhost:10001/test/dalaoyang,遠程調用成功。

技術分享圖片

6.源碼

服務提供者:https://gitee.com/dalaoyang/springcloud_learn/tree/master/springcloud_nacos_discovery_provider

服務消費者:https://gitee.com/dalaoyang/springcloud_learn/tree/master/springcloud_nacos_discovery_consumer

SpringCloud使用Nacos服務發現實現遠程調用