本章主要讲述服务网关、配置中心、注册中心 结合使用
结合使用微服务架构的 服务网关、配置中心、注册中心。
回顾一下:之前分别讲述了Nacos的配置中心、注册中心单独使用,记得在注册中心一章中我们是在消费者微服务中先进行了接口地址的寻址,然后再调用的。这次加上服务网关,就不用这么麻烦啦!只要将服务网关也注册到服务中心,那么服务网关就会自动代理服务中心的服务,相当于Nginx的作用。
介绍一下这个组合吧:
服务网关:Spring Cloud GateWay
注册中心:Spring Cloud Alibaba Nacos Discovery
配置中心:Spring Cloud Alibaba Nacos Config
Nacos部署以及注册中心:https://blog.csdn.net/u011177064/article/details/104107033
Nacos配置中心使用:https://blog.csdn.net/u011177064/article/details/104118986
服务网关集成步骤
首先我们建立一个新的工程,我这里命名 combat-gateway好啦。
和之前的工程相比,pom.xml 中新加上这两个依赖。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
完整的pom.xml 如下:
<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>
<groupId>com.zjf.csdn</groupId>
<artifactId>combat-gateway</artifactId>
<version>0.0.1-SNAPSHOT</version>
<description>zjf微服务实战</description>
<name>combat-gateway</name>
<url>https://blog.csdn.net/u011177064</url>
<properties>
<!-- Dependency Versions -->
<spring.boot.version>2.1.0.RELEASE</spring.boot.version>
<spring.cloud.version>Greenwich.SR2</spring.cloud.version>
<spring.cloud.alibaba.version>2.1.0.RELEASE</spring.cloud.alibaba.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<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>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>spring</id>
<repositories>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/libs-snapshot-local</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>false</enabled>
</releases>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone-local</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>spring-releases</id>
<name>Spring Releases</name>
<url>https://repo.spring.io/release</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/libs-snapshot-local</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>false</enabled>
</releases>
</pluginRepository>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone-local</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>spring-releases</id>
<name>Spring Releases</name>
<url>https://repo.spring.io/libs-release-local</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
</project>
这里有一点要特别注意:网关工程pom.xml里需要去掉这个依赖,因为和gateway里的webflux依赖是有冲突的。
(如不去掉会报错: Error creating bean with name 'routeDefinitionRouteLocator' )
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
然后配置文件 application.yml 如下:
server:
port: 9000
spring:
application:
name: gateway
cloud:
gateway:
discovery:
locator:
enabled: true
nacos:
discovery:
server-addr: 127.0.0.1:8848
management:
endpoints:
web:
exposure:
include: "*"
其中,spring.cloud.gateway.discovery.locator.enabled = true , 这个就表示让 gateway 来自动代理服务注册中心上的服务。
下面一行的 nacos.discovery.server-addr 则是配置好nacos服务注册中心的地址。(前提是已经部署好nacos)
接下来就写一个启动类了,需要加上 @EnableDiscoveryClient 注解来开启和服务注册中心的连接。
@SpringBootApplication
@EnableDiscoveryClient
@ComponentScan
public class NacosApplication {
public static void main(String[] args) {
SpringApplication.run(NacosApplication.class, args);
}
}
效果验证
启动后,查看Nacos后台是否已经有gateway服务注册进来,另外,我们把以前章节里搭建好的 combat-provider 也启动起来。
如图所示,效果是已经成功启动了 combat-gateway 和 combat-provider,并且也都向服务中心注册了服务。
接下来,调用 combat-gateway 中的服务网关接口
http://127.0.0.1:9000/nacos-provider/config/version
发现已经有正确的返回了。
而这个返回数据来自 combat-provider的 http://127.0.0.1:9999/nacos-provider/config/version
SpringCloud GateWay 的默认转发规则:
http://网关地址:端口/服务注册中心的serviceId/具体的url
例如:
http://127.0.0.1:9000【网关地址+端口】/nacos-provider【provider服务注册到服务中心的ID】/config/version 【provider服务中的具体接口地址】