Nacos 服務注冊與發(fā)現(xiàn)實操

基于spring cloud alibaba 搭建微服務闸天。

父工程的創(chuàng)建

父工程選擇使用spring boot 2.3.0.RELEASE苞氮,JDK 8瓤逼,idea 2021,Windows 10贷帮。

<?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 https://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.3.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.noel.cloud</groupId>
    <artifactId>alibaba</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>alibaba</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </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>Hoxton.SR3</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.1.RELEASE</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

編輯器生成代碼后,添加cloudHoxton.SR3alibaba cloud潜必。spring boot-> spring cloud-> spring cloud alibaba磁滚。

服務治理中心

服務注冊與發(fā)現(xiàn).png

如上圖所示的微服務群恨旱,各個微服務往服務治理中心注冊服務坝疼,即充當服務提供者角色钝凶;然后其它微服務通過服務治理中心獲取其它服務的信息,并調(diào)用這些服務掂名,此時充當服務消費者角色饺蔑。其中服務治理中心使用naocs實現(xiàn)嗜诀。

nacos下載1.2.1,因為使用的alibaba版本发皿,對應的nacos可以選擇1.2.1:

版本對應.png

下載后解壓到一個位置穴墅,然后雙擊bin\startup.cmd即啟動服務治理中心,通過http://localhost:8848/nacos即可訪問皇钞,默認訪問端口是8848鹅士,用戶名和密碼均是nacos惩坑。

服務提供者

使用springboot 創(chuàng)建子模塊,不用選擇依賴趾痘,生成代碼后更改繼承關(guān)系永票,更改<parent>數(shù)據(jù):

修改繼承關(guān)系.png

然后添加nacos依賴:

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

最后配置spring boot項目:

spring:
  cloud:
    nacos:
      discovery:
        server-addr: nacos的ip或者域名:nacos的端口
  application:
    name: provider #指定當前項目的名稱侣集,便于在nacos中顯示

啟動項目世分,即可在nacos網(wǎng)頁中缀辩,即可看見運行的服務提供者:

服務治理中心運行結(jié)果.png

服務消費者

父工程中創(chuàng)建一個子模塊臀玄,創(chuàng)建和修改繼承關(guān)系和提供者一樣健无,而且應為需要通過nacos獲取服務,所以也需要添加和提供者一樣的nacos服務募胃。消費者調(diào)用提供者的方法有幾個方法畦浓,下面一次列舉讶请,消費者的端口定義為8180:

方法一夺溢,獲取所有服務提供者:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ConsumerController {

    @Autowired
    private DiscoveryClient discoveryClient;

    @GetMapping("/instance")
    public List<ServiceInstance> instances(){
        List<ServiceInstance> providers = this.discoveryClient.getInstances("provider");
        return providers;
    }
}
消費訪問結(jié)果.png

獲取nacos上所注冊的所有服務提供者嘉汰,provider為服務器提供者的application-name状勤。

方法二持搜,調(diào)用服務提供者的某些方法:

服務提供方:

@RestController
public class ProviderController {
    @Value("${server.port}")
    private String port;
    
    @GetMapping("/index")
    public String index(){
        //實現(xiàn)一個簡單的返回服務提供者的端口功能
        return this.port;
    }
}

消費者:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;
import java.util.concurrent.ThreadLocalRandom;

/**
 * @Description 服務消費者葫盼,調(diào)用服務提供者的方法,獲取其返回的端口數(shù)據(jù)抛猫。
 * @Author noel
 * @Date 2021/7/19
 * Version 1.0
 **/
@RestController
public class ConsumerController {

    //使用springboot 集成的Nacos客戶端發(fā)現(xiàn)功能闺金,自動注入
    @Autowired
    private DiscoveryClient discoveryClient;

    //restTemplate 需要手動注入钱反,通過添加配置類實現(xiàn)
    @Autowired
    private RestTemplate restTemplate;
    
    /**
    * 通過nacos獲取“provider”服務面哥,如果該服務有集群,則隨機獲取其中一個
    **/
    @GetMapping("/index")
    public String index(){
        List<ServiceInstance> provider = this.discoveryClient.getInstances("provider");
        int index = ThreadLocalRandom.current().nextInt(provider.size());
        ServiceInstance serviceInstance = provider.get(index);
        String url = serviceInstance.getUri()+ "/index";//服務提供者的接口
        //指定String.class是因為服務提供者返回的是字符串
        return "調(diào)用的端口是"+serviceInstance.getPort()+"的服務归榕,返回結(jié)果是:"+ restTemplate.getForObject(url, String.class);
    }
}
// ========================================
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * @Description 將RestTemplate配置為Bean
 * @Author noel
 * @Date 2021/7/22
 * Version 1.0
 **/
@Configuration
public class RestTemplateConfig {

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

服務消費者照普通spring boot項目啟動后吱涉,訪問index接口即對服務提供者產(chǎn)生了調(diào)用。

Ribbon優(yōu)化服務消費者

ribbon引用.png

在使用springcloud的時候怎爵,就已經(jīng)加載了Ribbon鳖链,然后修改兩個地方即有效的使用Ribbon進行負載均衡,這是客戶端負載均衡狂秦,而且比上面的客戶端使用隨機數(shù)調(diào)用服務者更優(yōu)雅推捐。

import org.springframework.cloud.client.loadbalancer.LoadBalanced;

@Configuration
public class RestTemplateConfig {

    @Bean
    @LoadBalanced //增加的注解牛柒,
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

在RestTemplate配置類中焰络,添加@LoadBalanced注解,即表明調(diào)用方式使用了負載均衡甜孤。此處默認使用了輪詢的方式缴川。

@GetMapping("/index")
public String index(){
    //        List<ServiceInstance> provider = this.discoveryClient.getInstances("provider");
    //        int index = ThreadLocalRandom.current().nextInt(provider.size());
    //        ServiceInstance serviceInstance = provider.get(index);
    //        String url = serviceInstance.getUri()+ "/index";
    //        return "調(diào)用的端口是"+serviceInstance.getPort()+"的服務描馅,返回結(jié)果是:"+ restTemplate.getForObject(url, String.class);
    return this.restTemplate.getForObject("http://provider/index", String.class);
}

只需指明服務提供者的地址即可铭污,其中訪問地址中的provider使用的是服務提供者的application name值嘹狞。

P.S. 課程參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谈截,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子簸喂,更是在濱河造成了極大的恐慌喻鳄,老刑警劉巖确封,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡腥放,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來种柑,“玉大人聚请,你說我怎么就攤上這事≌ū埃” “怎么了盖文?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵五续,是天一觀的道長龄恋。 經(jīng)常有香客問我篙挽,道長铣卡,這世上最難降的妖魔是什么煮落? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任旋讹,我火速辦了婚禮殖蚕,結(jié)果婚禮上睦疫,老公的妹妹穿的比我還像新娘。我一直安慰自己鞭呕,他們只是感情好蛤育,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著葫松,像睡著了一般瓦糕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上腋么,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天咕娄,我揣著相機與錄音,去河邊找鬼珊擂。 笑死圣勒,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的未玻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼庇绽,長吁一口氣:“原來是場噩夢啊……” “哼耕餐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起明未,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤披摄,失蹤者是張志新(化名)和其女友劉穎义辕,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡美澳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年雨膨,在試婚紗的時候發(fā)現(xiàn)自己被綠了撒妈。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舆床。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖坷备,靈堂內(nèi)的尸體忽然破棺而出赌蔑,到底是詐尸還是另有隱情,我是刑警寧澤趾浅,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布证膨,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏井濒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一润梯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扫倡,春花似錦疚鲤、人聲如沸语淘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽榕茧。三九已至肢簿,卻和暖如春收夸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奋姿,地道東北人粪狼。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容