Nacos服務(wù)發(fā)現(xiàn)-四畦娄、Spring Cloud Alibaba綜合集成架構(gòu)演示

前面說到Spring Cloud是一個較為全面的微服務(wù)框架集又沾,集成了如服務(wù)注冊發(fā)現(xiàn)、配置中心纷责、消息總線捍掺、負(fù)載均衡撼短、斷路器再膳、API網(wǎng)關(guān)等功能實現(xiàn)。

Dubbo在國內(nèi)有著非常大的用戶群體曲横,但是其周邊設(shè)施與組件相對來說并不那么完善喂柒。很多開發(fā)者用戶又很希望享受Spring Cloud的生態(tài)不瓶,因此也會有一些Spring Cloud與Dubbo一起使用的案例與方法出現(xiàn),但是一直以來大部分Spring Cloud整合Dubbo的使用方案都不完善灾杰。直到Spring Cloud Alibaba的出現(xiàn)蚊丐,才得以解決這樣的問題。

此前艳吠,已經(jīng)學(xué)習(xí)如何使用Spring Cloud Alibaba來集成Nacos與Spring Cloud應(yīng)用麦备,并且在此之下可以如傳統(tǒng)的Spring Cloud應(yīng)用一樣地使用Ribbon或Feign來微服務(wù)之間的協(xié)作。由于Feign是基于Http Restful的調(diào)用昭娩,在高并發(fā)下的性能不夠理想凛篙。

所以此案例將使用Dubbo通過RPC對服務(wù)進(jìn)行調(diào)用~

PS:網(wǎng)上經(jīng)常會發(fā)現(xiàn)Spring Cloud與阿里巴巴的Dubbo進(jìn)行選擇對比,這樣做其實不是很妥當(dāng)栏渺,前者是一套較為完整的架構(gòu)方案呛梆,而Dubbo只是服務(wù)治理與RPC實現(xiàn)方案。

4.1 總體結(jié)構(gòu)

系統(tǒng)架構(gòu)圖如下:

image-20210118115704951.png

組件說明:

  • API網(wǎng)關(guān) :系統(tǒng)統(tǒng)一入口磕诊,屏蔽架構(gòu)內(nèi)部結(jié)構(gòu)填物,統(tǒng)一安全攔截,采用Zuul實現(xiàn)霎终。
  • application-1 :應(yīng)用1滞磺,模擬應(yīng)用,提供http接口服務(wù)莱褒。
  • service-1 :微服務(wù)1雁刷,模擬微服務(wù),提供dubbo接口服務(wù)保礼。
  • service-2 :微服務(wù)2沛励,模擬微服務(wù),提供dubbo接口服務(wù)炮障。

調(diào)用流程:

  • 所有訪問系統(tǒng)的請求都要經(jīng)過網(wǎng)關(guān)目派,網(wǎng)關(guān)轉(zhuǎn)發(fā)http請求至application-1,application-1使用dubbo調(diào)用service1完成自身業(yè)務(wù)胁赢,而后sevice1調(diào)用service2完成自身業(yè)務(wù)企蹭。至此,完成所有組件貫穿智末。

架構(gòu)中application與sevice的區(qū):

  • service提供了基礎(chǔ)服務(wù)功能谅摄;application組裝基礎(chǔ)服務(wù)功能,提供給用戶直接可用的業(yè)務(wù)系馆。
  • service服務(wù)粒度小送漠、功能基礎(chǔ),不易發(fā)生改變由蘑;application提供上游業(yè)務(wù)功能闽寡,緊貼業(yè)務(wù)需求代兵,容易發(fā)生改變。
  • 形成service支撐application的整體架構(gòu)爷狈,增加多變的application甚至不需要變動service植影。

4.2 工程結(jié)構(gòu)

采用Maven工程,結(jié)構(gòu)如下:

nacos‐discovery‐dubbo       整體父工程
├─api‐gateway               API網(wǎng)關(guān)涎永,端口:56010
├─application               應(yīng)用1思币,端口:56020
├─myservice                 服務(wù)1父工程
│ ├─myservice‐api            服務(wù)1API
│ └─myservice‐server         服務(wù)1實現(xiàn),端口:56030
└─yourservice               服務(wù)2父工程
  ├─yourservice‐api          服務(wù)2API
  └─yourservice‐server       服務(wù)2實現(xiàn)羡微,端口:56040

4.3 創(chuàng)建工程結(jié)構(gòu)

4.3.1 創(chuàng)建父工程

image-20210118142306113.png
image-20210119192733675.png
image-20210118142441357.png

4.3.2 創(chuàng)建網(wǎng)關(guān)模塊

image-20210118143444539.png
image-20210118143509571.png

4.3.3 創(chuàng)建應(yīng)用模塊

image-20210119193110629.png
image-20210119193153316.png

4.3.4 創(chuàng)建myservice模塊

image-20210119193352586.png
image-20210119193419360.png

4.3.5 創(chuàng)建myservice-api子模塊

image-20210119193512943.png
image-20210119193547416.png

4.3.6 創(chuàng)建myservice-server子模塊

image-20210119193651722.png
image-20210119193739494.png

4.3.7 創(chuàng)建yourservice模塊

image-20210119193820887.png
image-20210119193847377.png

4.3.8 創(chuàng)建yourservice-api子模塊

image-20210119193942505.png
image-20210119194018041.png

4.3.9 創(chuàng)建yourservice-server子模塊

image-20210119194446259.png
image-20210119194523119.png

4.3.10 創(chuàng)建后的工程

image-20210119194643624.png

4.4 添加父工程依賴

pom.xml

<?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>net.zhi365</groupId>
    <artifactId>nacos-discovery-dubbo</artifactId>
    <packaging>pom</packaging>
    <version>1.0</version>
    <modules>
        <module>api-gateway</module>
        <module>application</module>
        <module>myservice</module>
        <module>yourservice</module>
    </modules>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
        <spring-cloud-alibaba.version>2.1.1.RELEASE</spring-cloud-alibaba.version>
        <spring-boot.version>2.1.3.RELEASE</spring-boot.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!-- SpringCloud 微服務(wù) -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- SpringCloud Alibaba 微服務(wù) -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- SpringBoot 依賴配置 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.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.5 實現(xiàn)application

4.5.1 添加依賴

pom.xml

<?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>nacos-discovery-dubbo</artifactId>
        <groupId>net.zhi365</groupId>
        <version>1.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>application</artifactId>

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

        <!-- SpringCloud Ailibaba Nacos Config -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

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

4.5.2 編寫啟動類

ApplicationBootstrap.java

package net.zhi365.application;

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

/**
 * @author Xin.li
 * @date 2021-01-19 20:02
 */
@SpringBootApplication
@EnableDiscoveryClient
public class ApplicationBootstrap {
    public static void main(String[] args) {
        SpringApplication.run( ApplicationBootstrap.class, args );
    }
}

4.5.3 配置文件

bootstrap.yml

server:
  # 啟動端口支救,命令行注入
  port: 56020
  servlet:
    context-path: /application1
spring:
  application:
    name: application1
  main:
    # Spring Boot 2.1 需要設(shè)定
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: 470cd824-4b0a-4001-bcac-8491cf2987f8
        cluster-name: DEFAULT
      config:
        # 配置中心地址
        server-addr: 127.0.0.1:8848
        file-extension: yaml
        # 開發(fā)環(huán)境
        namespace: 470cd824-4b0a-4001-bcac-8491cf2987f8
        # NACOS_DISCOVERY_DUBBO業(yè)務(wù)組
        group: NACOS_DISCOVERY_DUBBO

4.5.4 控制層

ApplicationController.java

package net.zhi365.application.web;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author Xin.li
 * @date 2021-01-19 20:07
 */
@RestController
public class ApplicationController {
    @GetMapping("/applicationService")
    public String service(){
        return "applicationService";
    }
}

4.5.5 查看Nacos控制臺

image-20210119201131600.png

4.5.6 訪問服務(wù)

啟動程序后,訪問:http://localhost:56020/application/service/拷淘,得到如下結(jié)果各墨,表示服務(wù)正常

image-20210119201153726.png

4.6 實現(xiàn)myservice

4.6.1 定義myservice-api

為了方便其它服務(wù)調(diào)用dubbo服務(wù),專門定義api工程启涯,此工程將作為jar被其它工程依賴贬堵。

MyService.java

package net.zhi365.myservice.api;

/**
 * @author Xin.li
 * @date 2021-01-19 20:13
 */
public interface MyService {
    public String service();
}

4.6.2 實現(xiàn)myservice-server

pom.xml

<?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>myservice</artifactId>
        <groupId>net.zhi365</groupId>
        <version>1.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>myservice-server</artifactId>

    <dependencies>
        <dependency>
            <groupId>net.zhi365</groupId>
            <artifactId>myservice-api</artifactId>
            <version>1.0</version>
            <scope>compile</scope>
        </dependency>

        <!-- SpringCloud Ailibaba Nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!-- SpringCloud Ailibaba Nacos Config -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!-- SpringCloud Ailibaba Dubbo -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
        </dependency>
    </dependencies>
</project>

MyServiceImpl.java

package net.zhi365.myservice.service;

import net.zhi365.myservice.api.MyService;
import org.apache.dubbo.config.annotation.Service;

/**
 * @author Xin.li
 * @date 2021-01-19 20:25
 */
@Service
public class MyServiceImpl implements MyService {
    public String service() {
        return "MyService invoke~";
    }
}

注:使用@org.apache.dubbo.config.annotation.Service標(biāo)記dubbo服務(wù)

4.6.3 配置Dubbo服務(wù)

YourService作為Dubbo服務(wù)消費方配置與服務(wù)提供方類似,注意结洼,MyService不僅是消費方黎做,同時還是服務(wù)提供方:

server:
  # 啟動端口 命令行注入
  port: ${port:56030}

spring:
  application:
    name: myservice
  main:
    # Spring Boot 2.1 需要設(shè)定
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        namespace: 470cd824-4b0a-4001-bcac-8491cf2987f8
        cluster-name: DEFAULT
      config:
        # 配置中心地址
        server-addr: localhost:8848
        file-extension: yaml
        # 開發(fā)環(huán)境
        namespace: 470cd824-4b0a-4001-bcac-8491cf2987f8
        # NACOS_DISCOVERY_DUBBO業(yè)務(wù)組
        group: NACOS_DISCOVERY_DUBBO
dubbo:
  scan:
    # dubbo 服務(wù)掃描基準(zhǔn)包
    base-packages: net.zhi365.myservice
  protocol:
    # dubbo 協(xié)議
    name: dubbo
    # dubbo 協(xié)議端口
    port: ${dubbo_port:20881}
  registry:
    address: nacos://localhost:8848
  application:
    # dubbo 運維服務(wù)是否開啟
    qos-enable: false
  consumer:
    # 啟動時就否檢查依賴的服務(wù)
    check: false

以上 YAML 內(nèi)容,dubbo開頭的為dubbo服務(wù) 的配置:

  • dubbo.scan.base-packages : 指定 Dubbo 服務(wù)實現(xiàn)類的掃描基準(zhǔn)包松忍,將@org.apache.dubbo.config.annotation.Service注解標(biāo)注的service暴露為dubbo服務(wù)蒸殿。

  • dubbo.protocol : Dubbo 服務(wù)暴露的協(xié)議配置,其中子屬性 name 為協(xié)議名稱鸣峭, port 為dubbo協(xié)議端口可以指定多協(xié)議宏所,如:dubbo.protocol.rmi.port=1099

  • dubbo.registry : Dubbo 服務(wù)注冊中心配置,其中子屬性 address 的值 "nacos://localhost:8848"摊溶,說明dubbo服務(wù)注冊到nacos

    相當(dāng)于原生dubbo的xml配置中的 <dubbo:registry address="10.20.153.10:9090" />

上半部分為SpringCloud的相關(guān)配置:

  • spring.application.name : Spring應(yīng)用名稱爬骤,用于 Spring Cloud 服務(wù)注冊和發(fā)現(xiàn)。
該值在 Dubbo Spring Cloud 加持下被視作 dubbo.application.name 莫换,因此霞玄,無需再顯示地配置dubbo.application.name
  • spring.cloud.nacos.discovery : Nacos 服務(wù)發(fā)現(xiàn)與注冊配置,其中子屬性 server-addr 指定 Nacos 服務(wù)器主機和端口拉岁。
  • spring.cloud.nacos.config : Nacos 配置中心配置坷剧,其中子屬性 server-addr 指定 Nacos 服務(wù)器主機和端口。

4.6.4 啟動類

package net.zhi365.myservice;

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

/**
 * @author Xin.li
 * @date 2021-01-19 20:48
 */
@SpringBootApplication
@EnableDiscoveryClient
public class MyServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyServiceApplication.class, args);
    }
}

4.6.5 查看Nacos控制臺

當(dāng) MyServiceApplication啟動后喊暖,應(yīng)用 myservice將出現(xiàn)在 Nacos 控制臺界面惫企,如下圖:

image-20210119212254249.png

4.7 實現(xiàn)application調(diào)用myservice

現(xiàn)在myservice已暴露dubbo服務(wù)并注冊到nacos中,下邊實現(xiàn)application調(diào)用myservice

4.7.1 在application中引入依賴

<!-- SpringCloud Ailibaba Dubbo -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>

<dependency>
    <groupId>net.zhi365</groupId>
    <artifactId>myservice-api</artifactId>
    <version>1.0</version>
</dependency>

注:引入 spring-cloud-starter-dubbo依賴哄啄,它會根據(jù)接口生成代理對象

4.7.2 修改Controller

package net.zhi365.application.web;

import net.zhi365.myservice.api.MyService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author Xin.li
 * @date 2021-01-19 20:07
 */
@RestController
public class ApplicationController {

    @Reference
    private MyService myService;

    @GetMapping("/service")
    public String service(){
        return "Test:" +myService.service();
    }
}

注:這里的@Reference 注解是org.apache.dubbo.config.annotation.Reference

4.7.3 查看Nacos控制臺

image-20210119213436455.png

發(fā)現(xiàn)application與myservice已經(jīng)全都注冊成功

4.7.4 測試

訪問:http://localhost:56020/application/service/

image-20210119213825849.png

表示調(diào)用成功

4.8 實現(xiàn)yourservice

4.8.1 定義yourservice-api

為了方便其它服務(wù)調(diào)用dubbo服務(wù)雅任,專門定義api工程风范,此工程將作為jar被其它工程依賴咨跌。

YourService.java

package net.zhi365.youservice.api;

/**
 * @author Xin.li
 * @date 2021-01-19 21:52
 */
public interface YourService {
    public String service();
}

4.8.2 實現(xiàn)yourservice-server

pom.xml

<?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>yourservice</artifactId>
        <groupId>net.zhi365</groupId>
        <version>1.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>yourservice-server</artifactId>

    <dependencies>
        <dependency>
            <groupId>net.zhi365</groupId>
            <artifactId>yourservice-api</artifactId>
            <version>1.0</version>
            <scope>compile</scope>
        </dependency>

        <!-- SpringCloud Ailibaba Nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!-- SpringCloud Ailibaba Nacos Config -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!-- SpringCloud Ailibaba Dubbo -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
        </dependency>
    </dependencies>
</project>

以上依賴 artifact 說明如下:

  • yourservice-api:提供YourService接口的artifact
  • spring-boot-starter-web:Spring Boot starter artifact 沪么,間接引入spring-boot artifact
  • spring-cloud-starter-dubbo:Dubbo Spring Cloud Starter artifact ,間接引入 dubbo-spring-bootstarter
    等 artifact
  • spring-cloud-starter-alibaba-nacos-discovery:Nacos Spring Cloud 服務(wù)注冊與發(fā)現(xiàn) artifact

YourServiceImpl.java

package net.zhi365.yourservice.service;

import net.zhi365.youservice.api.YourService;
import org.apache.dubbo.config.annotation.Service;

/**
 * @author Xin.li
 * @date 2021-01-19 22:14
 */
@Service
public class YourServiceImpl implements YourService {
    public String service() {
        return "YourService invoke";
    }
}

4.8.3 實現(xiàn) Dubbo服務(wù)

在暴露 Dubbo 服務(wù)方面锌半,推薦開發(fā)人員外部化配置的方式禽车,即指定 Java 服務(wù)實現(xiàn)類的掃描基準(zhǔn)包。

Dubbo Spring Cloud 繼承了 Dubbo Spring Boot 的外部化配置特性刊殉,也可以通過標(biāo)注@DubboComponentScan 來實現(xiàn)基準(zhǔn)包掃描殉摔。

同時,Dubbo 遠(yuǎn)程服務(wù)需要暴露網(wǎng)絡(luò)端口记焊,并設(shè)定通訊協(xié)議逸月,完整的 YAML 配置如下所示:

server:
  # 啟動端口 命令行注入
  port: ${port:56040}
spring:
  application:
    name: yourservice
  main:
    # Spring Boot 2.1 需要設(shè)定
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        namespace: 470cd824-4b0a-4001-bcac-8491cf2987f8
        cluster-name: DEFAULT
      config:
        # 配置中心地址
        server-addr: 127.0.0.1:8848
        file-extension: yaml
        # 開發(fā)環(huán)境
        namespace: 470cd824-4b0a-4001-bcac-8491cf2987f8
        # NACOS_DISCOVERY_DUBBO業(yè)務(wù)組
        group: NACOS_DISCOVERY_DUBBO
dubbo:
  scan:
    # dubbo 服務(wù)掃描基準(zhǔn)包
    base-packages: net.zhi365.yourservice
  protocol:
    # dubbo 協(xié)議
    name: dubbo
    # dubbo 協(xié)議端口
    port: ${dubbo_port:20882}
  registry:
    address: nacos://localhost:8848
  application:
    # dubbo 運維服務(wù)是否開啟
    qos-enable: false
  consumer:
    # 啟動時就否檢查依賴的服務(wù)
    check: false

4.8.4 啟動類

package net.zhi365.yourservice;

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

/**
 * @author Xin.li
 * @date 2021-01-19 22:29
 */
@SpringBootApplication
@EnableDiscoveryClient
public class YourServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(YourServiceApplication.class, args);
    }
}

4.8.5 查看Nacos控制臺

當(dāng) YourServiceApplication啟動后,應(yīng)用 yourservice將出現(xiàn)在 Nacos 控制臺界面遍膜,如下圖:

image-20210119225915121.png

4.9 實現(xiàn)myservice調(diào)用yourservice

4.9.1 在myservice中引用yourservice

<dependency>
    <groupId>net.zhi365</groupId>
    <artifactId>yourservice-api</artifactId>
    <version>1.0</version>
</dependency>

4.9.2 實現(xiàn)遠(yuǎn)程調(diào)用

MyServiceImpl.java

package net.zhi365.myservice.service;

import net.zhi365.myservice.api.MyService;
import net.zhi365.youservice.api.YourService;
import org.apache.dubbo.config.annotation.Reference;
import org.apache.dubbo.config.annotation.Service;

/**
 * @author Xin.li
 * @date 2021-01-19 20:25
 */
@Service
public class MyServiceImpl implements MyService {
    @Reference
    private YourService yourService;

    public String service() {
        return "MyService invoke~|" +yourService.service();
    }
}

4.9.3 測試

http://localhost:56020/application/service/

image-20210119230452015.png

4.10 實現(xiàn)api-gateway

4.10.1 Zuul介紹

什么是網(wǎng)關(guān)碗硬?

原來的單體架構(gòu),所有的服務(wù)都是本地的瓢颅,UI可以直接調(diào)用恩尾,現(xiàn)在按功能拆分成獨立的服務(wù),一般都跑在獨立的虛擬機上的 Java進(jìn)程中挽懦『惨猓客戶端UI如何訪問?他的后臺有N個服務(wù)信柿,前臺就需要記住管理N個服務(wù)冀偶,一個服務(wù)下線/更新/升級,前臺就要重新部署渔嚷,這明顯不符合拆分的理念蔫磨,特別當(dāng)前臺是移動應(yīng)用的時候,通常業(yè)務(wù)變化的節(jié)奏更快圃伶。另外堤如,N個小服務(wù)的調(diào)用也是一個不小的網(wǎng)絡(luò)開銷。

image-20210120002921356.png

有了網(wǎng)關(guān)作為服務(wù)統(tǒng)一入口窒朋,就可以避免上述問題搀罢,不僅如此,服務(wù)網(wǎng)關(guān)是在微服務(wù)前邊設(shè)置一道屏障侥猩,請求先到服務(wù)網(wǎng)關(guān)榔至,網(wǎng)關(guān)會對請求進(jìn)行過慮、校驗欺劳、路由等處理唧取。有了服務(wù)網(wǎng)關(guān)可以提高微服務(wù)的安全性铅鲤,網(wǎng)關(guān)校驗請求的合法性,請求不合法將被攔截枫弟,拒絕訪問邢享。

  • 提供統(tǒng)一服務(wù)入口,讓微服務(wù)對前臺透明
  • 聚合后臺的服務(wù)淡诗,節(jié)省流量骇塘,提升性能
  • 提供安全,過濾韩容,流控等API管理功能

什么是Zuul款违?

Spring Cloud Zuul是整合Netflix公司的Zuul開源項目實現(xiàn)的微服務(wù)網(wǎng)關(guān),它實現(xiàn)了請求路由群凶、負(fù)載均衡插爹、校驗過慮等 功能。

官方:https://github.com/Netflix/zuul

Zuul與Nginx怎么配合使用请梢?

Zuul與Nginx在實際項目中需要配合使用赠尾,如下圖,Nginx的作用是反向代理溢陪、負(fù)載均衡萍虽,Zuul的作用是保障微服務(wù)的安全訪問,攔截微服務(wù)請求形真,校驗合法性及負(fù)載均衡杉编。

image-20210120003318250.png

4.10.2 搭建網(wǎng)關(guān)工程

(1) 添加依賴

<?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>nacos-discovery-dubbo</artifactId>
        <groupId>net.zhi365</groupId>
        <version>1.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>api-gateway</artifactId>

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

        <!-- SpringCloud Ailibaba Nacos Config -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

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

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>
</project>

(2) 編寫本地配置文件

bootstrap.yml

server:
  # 啟動端口 命令行注入
  port: 56010

spring:
  application:
    name: api-gateway
  main:
    # Spring Boot 2.1 需要設(shè)定
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        namespace: 470cd824-4b0a-4001-bcac-8491cf2987f8
        cluster-name: DEFAULT
      config:
        # 配置中心地址
        server-addr: localhost:8848
        file-extension: yaml
        # 開發(fā)環(huán)境
        namespace: 470cd824-4b0a-4001-bcac-8491cf2987f8
        # NACOS_DISCOVERY_DUBBO業(yè)務(wù)組
        group: NACOS_DISCOVERY_DUBBO

(3) 在Nacos控制臺編寫路由配置文件

image-20210120004807290.png
image-20210120005304232.png
zuul:
  routes:
    # 服務(wù)名
    application:
      stripPrefix: false
      path: /application/**

(4) 啟動類

package net.zhi365.apigateway;

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

/**
 * @author Xin.li
 * @date 2021-01-20 0:54
 */
@SpringBootApplication
@EnableDiscoveryClient
@EnableZuulProxy
public class ApiGatewayBootstrap {
    public static void main(String[] args) {
        SpringApplication.run(ApiGatewayBootstrap.class, args);
    }
}

(5) 查看Nacos控制臺

啟動服務(wù),查看Nacos控制臺咆霜,如下圖:

image-20210120095151774.png

(6) 測試

通過網(wǎng)關(guān)(api-gateway)請求application應(yīng)用邓馒,application的業(yè)務(wù)實現(xiàn)又貫穿myservice、yourservice

訪問http://127.0.0.1:56010/application/service 蛾坯,將得到如下結(jié)果:

image-20210120124459669.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末光酣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子脉课,更是在濱河造成了極大的恐慌救军,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件倘零,死亡現(xiàn)場離奇詭異唱遭,居然都是意外死亡,警方通過查閱死者的電腦和手機呈驶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進(jìn)店門拷泽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事司致〔疬海” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵脂矫,是天一觀的道長枣耀。 經(jīng)常有香客問我,道長羹唠,這世上最難降的妖魔是什么奕枢? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任娄昆,我火速辦了婚禮佩微,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘萌焰。我一直安慰自己哺眯,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布扒俯。 她就那樣靜靜地躺著奶卓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪撼玄。 梳的紋絲不亂的頭發(fā)上夺姑,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天,我揣著相機與錄音掌猛,去河邊找鬼盏浙。 笑死,一個胖子當(dāng)著我的面吹牛荔茬,可吹牛的內(nèi)容都是我干的废膘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼慕蔚,長吁一口氣:“原來是場噩夢啊……” “哼丐黄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起孔飒,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤灌闺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后坏瞄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體桂对,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年惦积,在試婚紗的時候發(fā)現(xiàn)自己被綠了接校。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蛛勉,靈堂內(nèi)的尸體忽然破棺而出鹿寻,到底是詐尸還是另有隱情,我是刑警寧澤诽凌,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布毡熏,位于F島的核電站,受9級特大地震影響侣诵,放射性物質(zhì)發(fā)生泄漏痢法。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一杜顺、第九天 我趴在偏房一處隱蔽的房頂上張望财搁。 院中可真熱鬧,春花似錦躬络、人聲如沸尖奔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽提茁。三九已至,卻和暖如春馁菜,著一層夾襖步出監(jiān)牢的瞬間茴扁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工汪疮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留峭火,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓铲咨,卻偏偏與公主長得像躲胳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子纤勒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,955評論 2 355

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

  • 隨著Spring Cloud Alibaba的發(fā)展坯苹,Spring Cloud Alibaba的相關(guān)組件逐漸的成熟,...
    程序猿小亮閱讀 1,310評論 0 5
  • 前言 從本章節(jié)開始摇天,我們學(xué)習(xí) Spring Cloud Alibaba 相關(guān)微服務(wù)組件粹湃。 Spring Cloud...
    哈嘍沃德先生閱讀 657評論 0 3
  • 久違的晴天,家長會泉坐。 家長大會開好到教室時为鳄,離放學(xué)已經(jīng)沒多少時間了。班主任說已經(jīng)安排了三個家長分享經(jīng)驗腕让。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,523評論 16 22
  • 今天感恩節(jié)哎孤钦,感謝一直在我身邊的親朋好友歧斟。感恩相遇!感恩不離不棄偏形。 中午開了第一次的黨會静袖,身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,566評論 0 11
  • 可愛進(jìn)取,孤獨成精俊扭。努力飛翔队橙,天堂翱翔。戰(zhàn)爭美好萨惑,孤獨進(jìn)取捐康。膽大飛翔,成就輝煌庸蔼。努力進(jìn)取解总,遙望,和諧家園朱嘴∏泠辏可愛游走...
    趙原野閱讀 2,727評論 1 1