SpringCloudAlibaba之Nacos服務的注冊與發現


教程首頁鏈接:SpringCloudAlibaba實戰教程系列  

-----------------------------目錄------------------------------------

1、構建父maven項目,引入pom依賴,對應第一步。

2、構建服務提供者,對應第二步。

3、構建服務消費者,對應第三步。

-----------------------------目錄------------------------------------

第一步:在父pom的項目中引入dependencyManagement。

在引入父pom之前咱們先來回顧下dependencyManagement與使用他的原因

什么是dependencyManagement:他可以統一管理項目的版本號,確保應用的各個子項目的依賴和版本一致,當需要變更版本號的時候只需要在父類容器里更新,不需要任何一個子項目的修改;如果某個子項目需要另外一個特殊的版本號時,只需要在自己的模塊dependencies中聲明一個版本號即可。子類就會使用子類聲明的版本號,不繼承於父類版本號。

為什么用dependencyManagement:首先在springCloudAlibaba的項目中對於版本的依賴要求很嚴格,所有需要統一來聲明管理每隔依賴的版本號。版本之間的關系參考SpringCloudAlibaba實戰教程系列  

   <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.1.8.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

在引入上面的版本聲明之后在父pom中引入下面幾個將要使用的依賴

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <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>
    </dependencies>

完整的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>

    <groupId>com.niu.cloud</groupId>
    <artifactId>cloud-alibaba</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>nacos-provider</module>
        <module>nacos-consumer</module>
    </modules>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.1.8.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--spring web-->
        <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>
    </dependencies>

    <repositories>
        <!--指定阿里雲鏡像庫下載依賴-->
        <repository>
            <id>central</id>
            <name>aliyunmaven</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        </repository>

    </repositories>
</project>
View Code

第二步:構建服務提供者進行服務注冊

  1、在父項目中創建子module項目名字為nacos-provider,在pom中引入nacos服務注冊依賴

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

 完整服務提供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">
    <parent>
        <artifactId>cloud-alibaba</artifactId>
        <groupId>com.niu.cloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>nacos-provider</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>

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

</project>
View Code

   2、application.yml或者properties文件

server:
port: 8080

spring:
#服務應用名字
application:
name: nacos-provider
#配置注冊ip:端口,注意即使是80端口也不可能省略
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848

  3、配置啟動服務的啟動類。為簡單化我這里http調用接口也開發出來了

package com.niu.cloud;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author niunafei
 * @function
 * @email niunafei0315@163.com
 * @date 2020/5/1  12:46 PM
 * @EnableDiscoveryClient 開啟服務注冊
 */
@EnableDiscoveryClient
@SpringBootApplication
@RestController
@Slf4j
public class ProviderApplication {

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

    /**
     * @return
     */
    @GetMapping("/provider")
    public String provider() {
        log.info("服務提供者正常服務");
        return "服務提供者正常服務";
    }
}

  4、在服務啟動的時候看到如下日志證明注冊成功

  5、查看http://localhost:8848/nacos,查看服務的注冊情況

 第三步:構建服務消費者進行服務調用

   1、在父項目中創建子module項目名字為nacos-comsumer,在pom中引入nacos服務注冊依賴

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

 完整服務提供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">
    <parent>
        <artifactId>cloud-alibaba</artifactId>
        <groupId>com.niu.cloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>nacos-comsumer</artifactId>


    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>

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

</project>
View Code

  2、application.yml或者properties文件

server:
port: 8081

spring:
#服務應用名字
application:
name: nacos-consumer
#配置注冊ip:端口,注意即使是80端口也不可能省略
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848

  3、服務消費有兩種實現方式

  方式1(推薦):簡單理解是在創建RestTemplate對象的時候添加 @LoadBalanced注解,該注解為底層為ribben來實現的負載均衡,詳情代碼如下:

package com.niu.cloud;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
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.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
* @author niunafei
* @function
* @email niunafei0315@163.com
* @date 2020/5/1 3:51 PM
*/
@Slf4j
@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApplication {

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

/**
* 創建服務調用的對象
*
* @return
* @LoadBalanced 添加此注解后,RestTemplate就具有了ribben客戶端負載均衡能力
*/
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}

@RestController
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;

@GetMapping("/consumer")
public String consumer() {
log.info("---------消費者開始------------");
//調用服務
String result = restTemplate.getForObject("http://nacos-provider/provider", String.class);
log.info("---------消費者結束--------result{}----", result);
return result;
}
}
}

  方式2:是springcloudalibaba的官網案列形式,依賴LoadBalancedClient來實現。

package com.niu.cloud;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * @author niunafei
 * @function
 * @email niunafei0315@163.com
 * @date 2020/5/1  3:51 PM
 */
@Slf4j
@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApplication {

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

    /**
     * 創建服務調用的對象
     *
     * @return
     */
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    @RestController
    public class ConsumerController {
        @Autowired
        private LoadBalancerClient client;
        @Autowired
        private RestTemplate restTemplate;

        @GetMapping("/consumer")
        public String consumer() {
            log.info("---------消費者開始------------");
            //獲取服務對象,注意nacos-provider是服務提供者應用名稱
            ServiceInstance instance = client.choose("nacos-provider");
            //調用服務
            String result = restTemplate.getForObject(instance.getUri() + "/provider", String.class);
            log.info("---------消費者結束--------result{}----", result);
            return result;
        }
    }
}
View Code

    4、啟動consumer服務,瀏覽器訪問消費者http://localhost:8081/consumer接口,可以看到下面服務者正常提供服務。

   5、看下方式一消費者調用日志如下圖: 首先是正常的注冊成功,看接下來的就是ribben實現負載均衡功能的調用日志(大概的流程是,通過完整的url進行拆分,根據服務名獲取注冊的服務列表,然后負載到某個服務,拼接ip與端口完善url,進行http調用,返回結果)。

 

 

教程首頁鏈接:SpringCloudAlibaba實戰教程系列  

為何一個@LoadBalanced注解就能讓RestTemplate擁有負載均衡的能力?【享學Spring Cloud】

RestTemplate的使用和原理你都爛熟於胸了嗎?【享學Spring MVC】


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM