网站建设与维护教学视频,文章博客媒体网站模板,建设购物网站费用,seo友情链接1.环境准备
1.1 拉取Nacos Docker镜像
从Docker Hub拉取Nacos镜像#xff1a;
docker pull nacos/nacos-server:v2.4.01.2 生成密钥
你可以使用命令行工具生成一个不少于32位的密钥。以下是使用 OpenSSL 生成 32 字节密钥的示例#xff1a;
openssl rand -base64 321.3 …1.环境准备
1.1 拉取Nacos Docker镜像
从Docker Hub拉取Nacos镜像
docker pull nacos/nacos-server:v2.4.01.2 生成密钥
你可以使用命令行工具生成一个不少于32位的密钥。以下是使用 OpenSSL 生成 32 字节密钥的示例
openssl rand -base64 321.3 启动Nacos容器
使用以下命令启动一个Nacos容器
docker run -d --name nacos-server \-e MODEstandalone \-e NACOS_AUTH_ENABLEtrue \-e NACOS_AUTH_TOKENjXd7Gp8MYxJVwK/Qj3d6h5XPwTRrqJL/vope5yHd8DA \-e NACOS_AUTH_IDENTITY_KEYyour-identity-key \-e NACOS_AUTH_IDENTITY_VALUEyour-identity-value \-e NACOS_AUTH_ENABLE_USERAGENT_AUTHWHITEtrue \-p 8848:8848 \-p 9848:9848 \nacos/nacos-server:v2.4.0NACOS_AUTH_ENABLEtrue 启用Nacos的身份验证。
NACOS_AUTH_TOKEN的值为正确的 Base64 编码字符串长度不少于 32 字节。
NACOS_AUTH_IDENTITY_KEYyour-identity-key 设置身份验证的key。
NACOS_AUTH_IDENTITY_VALUEyour-identity-value 设置身份验证的value。
NACOS_AUTH_ENABLE_USERAGENT_AUTHWHITEtrue 启用User Agent白名单绕过一些安全检查。 1.4 访问Nacos控制台
在Nacos容器启动后可以通过浏览器访问Nacos控制台URL如下 说明初始化密码。
1.5 创建命名空间 操作点击命名空间新建命名空间。 说明自己随便定义命名空间随便描述。 说明创建结果。
1.6 创建配置
1.7 创建gateway.yaml
hello: abc说明用来测试是否读取到配置信息点击发布即创建。
1.8 创建gateway-dynamic-routes.yaml
spring:cloud:gateway:routes:- id: service-routeuri: lb://producer-service-1predicates:- Path/service/**filters:- StripPrefix1说明
请求匹配当客户端发送一个HTTP请求时Spring Cloud Gateway会根据定义的路由进行匹配。它会首先检查请求路径是否匹配Path/service/**这个谓词。
前缀移除如果请求路径匹配StripPrefix1过滤器会移除路径的第一个部分。例如客户端请求/service/produce会被转换为/produce。
请求转发经过前缀移除后Gateway会根据uri配置将请求转发到producer-service-1服务。由于lb://前缀的存在Gateway会通过服务注册中心如Eureka或Consul找到producer-service-1服务的一个实例并将请求转发给该实例。 说明测试动态路由配置点击发布即创建。
1.9 创建结果 说明自定义的命名空间下创建两个配置文件。
2.项目结构 说明使用两个服务代表不同的路由模拟在没有重启网关服务的条件下实现通过Nacos修改配置文件实现网关路由的配置更新与发现。
2.1 pom.xml(父类)
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion3.3.2/versionrelativePath/ !-- lookup parent from repository --/parentgroupIdorg.example/groupIdartifactIdspring_nacos_gateway/artifactIdversion0.0.1-SNAPSHOT/versionpackagingpom/packagingmodulesmoduleproducer_service_1/modulemoduleproducer_service_2/module/modulespropertiesjava.version17/java.version/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build/project
说明两个提供者的父类配置文件网关模块不需要父类。
2.2 gateway模块 2.2.1 pom.xml
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdorg.example/groupIdartifactIdgateway/artifactIdversion0.0.1-SNAPSHOT/versionpropertiesjava.version22/java.versionspring-boot.version3.3.2/spring-boot.versionspring-cloud.version2023.0.1/spring-cloud.versionspring-cloud-alibaba.version2023.0.1.2/spring-cloud-alibaba.version/propertiesdependencyManagementdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-dependencies/artifactIdversion${spring-boot.version}/versiontypepom/typescopeimport/scope/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-dependencies/artifactIdversion${spring-cloud.version}/versiontypepom/typescopeimport/scope/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-alibaba-dependencies/artifactIdversion${spring-cloud-alibaba.version}/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagementdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-webflux/artifactId/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-gateway/artifactId/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-config/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-loadbalancer/artifactId/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-bootstrap/artifactId/dependencydependencygroupIdcom.alibaba.nacos/groupIdartifactIdnacos-client/artifactIdversion2.4.0-BETA/version/dependency!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic --dependencygroupIdch.qos.logback/groupIdartifactIdlogback-classic/artifactIdversion1.5.6/version/dependency!-- https://mvnrepository.com/artifact/com.alibaba.nacos/logback-adapter --dependencygroupIdcom.alibaba.nacos/groupIdartifactIdlogback-adapter/artifactIdversion1.1.1/version/dependency!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api --dependencygroupIdorg.slf4j/groupIdartifactIdslf4j-api/artifactIdversion2.1.0-alpha1/version/dependencydependencygroupIdio.grpc/groupIdartifactIdgrpc-netty/artifactIdversion1.57.2/version/dependency/dependencies
/project2.2.2 nacos-logback14.xml
?xml version1.0 encodingUTF-8?
configurationproperty nameLOG_DIR valuelogs/property nameAPP_NAME valuegateway-service/appender nameFILE classch.qos.logback.core.rolling.RollingFileAppenderfile${LOG_DIR}/${APP_NAME}.log/fileencoderpattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n/pattern/encoderrollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicyfileNamePattern${LOG_DIR}/${APP_NAME}-%d{yyyy-MM-dd}.%i.log/fileNamePatterntimeBasedFileNamingAndTriggeringPolicy classch.qos.logback.core.rolling.SizeAndTimeBasedFNATPmaxFileSize10MB/maxFileSize/timeBasedFileNamingAndTriggeringPolicymaxHistory30/maxHistory/rollingPolicy/appenderroot levelDEBUGappender-ref refFILE//root
/configuration2.2.3 bootstrap.yml
spring:application:name: gateway-servicecloud:nacos:discovery:server-addr: 192.168.186.77:8848username: nacospassword: 123456config:server-addr: 192.168.186.77:8848file-extension: yamlgroup: DEFAULT_GROUPnamespace: 94507d25-b8c3-4e5c-a8ef-b02b8ce4c0fb #命名空间的IDencode: UTF-8username: nacospassword: 123456gateway:discovery:locator:enabled: true # 启用动态路由发现功能。lower-case-service-id: true #将服务ID转换为小写config:import:- nacos:gateway.yaml #配置文件1- nacos:gateway-dynamic-routes.yaml #配置文件2
server:port: 8003说明通过以上配置Spring Cloud Gateway将会自动根据Nacos中的注册服务动态生成路由。例如如果有一个服务 order-service 注册到NacosGateway将自动为这个服务生成一个路由规则将所有以 /order-service/** 开头的请求转发到该服务。
2.2.4 GatewayApplication.java
package org.example;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.client.RestTemplate;SpringBootApplication
EnableDiscoveryClient
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class, args);}BeanLoadBalanced //启动请求的负载均衡public RestTemplate restTemplate() {return new RestTemplate();}
}2.2.5 ConfigController.java
package org.example.gateway;import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;RestController
RequestMapping(/config)
RefreshScope
public class ConfigController {Value(${hello:false})private String Hello;RequestMapping(/get)public String get() {return Hello;}
}2.3 producer_service_1模块 2.3.1 pom.xml
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.example/groupIdartifactIdspring_nacos_gateway/artifactIdversion0.0.1-SNAPSHOT/version/parentartifactIdproducer_service_1/artifactIdpackagingjar/packagingdependencies!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-discovery --dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactIdversion2023.0.1.2/version/dependency/dependencies
/project2.3.2 application.yml
server:port: 8001
spring:application:name: producer-service-1cloud:nacos:discovery:server-addr: http://192.168.186.77:8848username: nacospassword: 1234562.3.3 ProducerApplication01.java
package org.example.producer;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;SpringBootApplication
EnableDiscoveryClient
public class ProducerApplication01 {public static void main(String[] args) {SpringApplication.run(ProducerApplication01.class, args);}
}
2.3.4 ProducerController.java
package org.example.producer.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;RestController
public class ProducerController {GetMapping(/produce)public String produce() {return 服务提供者1号;}
}2.4 producer_service_2模块 说明实际上该部分跟producer_service_1结构完全一样只是改了一下启动类名还有端口配置。
2.4.1 pom.xml
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.example/groupIdartifactIdspring_nacos_gateway/artifactIdversion0.0.1-SNAPSHOT/version/parentartifactIdproducer_service_2/artifactIdpackagingjar/packagingdependencies!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-discovery --dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactIdversion2023.0.1.2/version/dependency/dependencies
/project
2.4.2 application.yml
server:port: 8002
spring:application:name: producer-service-2cloud:nacos:discovery:server-addr: http://192.168.186.77:8848username: nacospassword: 123456说明端口跟服务名同producer_service_1模块不一样。
2.4.3 ProducerApplication02.java
package org.example.producer;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;SpringBootApplication
EnableDiscoveryClient
public class ProducerApplication02 {public static void main(String[] args) {SpringApplication.run(ProducerApplication02.class, args);}
}2.4.4 ProducerController.java
package org.example.producer.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;RestController
public class ProducerController {GetMapping(/produce)public String produce() {return 服务提供者2号;}
}说明启动类同producer_service_1模块不一样方便区分。
3.测试验证
3.1 测试读取配置文件gateway.yaml 3.2 动态路由发现测试 解释Spring Cloud Gateway将会自动根据Nacos中的注册服务动态生成路由。例如如果有一个服务 order-service 注册到NacosGateway将自动为这个服务生成一个路由规则将所有以 /order-service/** 开头的请求转发到该服务本案例的服务是producer-service-2自行类比·。
3.2 手动修改配置重新发布gateway-dynamic-routes.yaml
未修改前 访问 修改 访问 4.总结
静态路由是在配置文件或配置中心中手动定义并且不会自动改变的路由。管理员需要手动添加或更新路由配置。
动态路由是指路由条目根据实时的网络状态或服务注册信息自动更新。使用服务发现机制路由器能够自动感知到服务的变化并调整路由表。
静态路由 vs 动态路由
特点静态路由动态路由配置方式手动配置自动配置维护复杂度高低适应网络变化差强使用场景小型、固定网络大型、动态变化网络依赖性低不依赖服务注册中心高依赖服务注册中心
在Nacos中静态路由适用于固定的、手动管理的路由配置而动态路由适用于自动化、高效管理的动态变化的服务路由配置。根据实际需求选择合适的路由方式可以提升系统的灵活性和可维护性。