前面說到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)圖如下:
組件說明:
- 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)建父工程
4.3.2 創(chuàng)建網(wǎng)關(guān)模塊
4.3.3 創(chuàng)建應(yīng)用模塊
4.3.4 創(chuàng)建myservice模塊
4.3.5 創(chuàng)建myservice-api子模塊
4.3.6 創(chuàng)建myservice-server子模塊
4.3.7 創(chuàng)建yourservice模塊
4.3.8 創(chuàng)建yourservice-api子模塊
4.3.9 創(chuàng)建yourservice-server子模塊
4.3.10 創(chuàng)建后的工程
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控制臺
4.5.6 訪問服務(wù)
啟動程序后,訪問:http://localhost:56020/application/service/拷淘,得到如下結(jié)果各墨,表示服務(wù)正常
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 控制臺界面惫企,如下圖:
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控制臺
發(fā)現(xiàn)application與myservice已經(jīng)全都注冊成功
4.7.4 測試
訪問:http://localhost:56020/application/service/
表示調(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 控制臺界面遍膜,如下圖:
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/
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ò)開銷。
有了網(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ù)載均衡杉编。
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控制臺編寫路由配置文件
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控制臺咆霜,如下圖:
(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é)果: