Nacos+GateWay 搭建微服务架构
文章目录
- 1.当前项目架构分析
- 1.请求多个模块的方式
- 1.请求renren-fast模块
- 开发环境
- 生产环境
- 2.请求sunliving-commodity模块
- 1.使用环境变量+资源路径的方式
- 2.开发环境 dev.env.js
- 3.生产环境 prod.env.js
- 3.文件上传请求 sunliving-service模块
- 1.请求后端接口(开发环境) policy.js
- 2.请求阿里云OSS
- 2.架构图
- 3.加入改进后的架构图
- 2.将三个微服务注册到Nacos
- 1.配置Nacos1.1.3到云服务器
- 1.GitHub下载压缩包
- 2.上传到宝塔
- 3.安装JDK8
- 1.将压缩包放到/opt/jdk下
- 2.进入/usr/local
- 3.创建文件夹 java
- 4.进入/opt/jdk
- 5.解压缩到/usr/local/java
- 6.进入 /usr/local/java/jdk1.8.0_261/bin 查看java版本
- 7.准备配置环境变量,复制java的bin目录位置 pwd可以查看当前目录
- 8.进入到环境变量的配置文件 `vim /etc/profile` ,移动到最后,配置环境变量
- 9.刷新环境变量使其生效,然后输出一下查看
- 10.输入 java -version,成功!
- 4.安装目录一般在 /usr/local 目录下,我们可以在此目录下新建一个目录nacos
- 5.进入这个软件目录
- 6.解压缩到/usr/local下的nacos目录
- 7.配置nacos的端口
- 1.进入nacos的conf目录
- 2.将cluster.conf.example文件复制命名为cluster.conf
- 3.编辑这个文件,设置ip和端口,可以配置多个
- 8进入安装目录 /usr/local/nacos/nacos/bin
- 9.执行nacos
- 10.宝塔和腾讯云都要开放8848端口
- 11.访问 http://ip:8848/nacos 用户名和密码都是nacos
- 12.nacos常用命令
- 1.查看所有开放端口 firewall-cmd --list-all
- 2.查看8848端口是否被占用 netstat -tulnp | grep 8848
- 3.查看nacos进程 ps -ef | grep nacos
- 4.重启nacos(修改配置文件之后重启)
- 2.配置sunliving-common模块引入Nacos依赖
- 1.使用dependencyManagement对本模块以及子模块进行版本仲裁
- 2.引入Nacos的依赖
- 3.目前状态
- 3.三个模块配置Nacos
- 1.sunliving-commodity模块配置Nacos
- 1.application.yml 配置Nacos的服务地址和application的name
- 2.在主启动类添加注解@EnableDiscoveryClient开启Nacos的服务发现
- 3.确保Nacos启动,然后启动这个模块,访问 http://ip:8848/nacos 注册成功!
- 2.sunliving-service模块配置Nacos
- 1.配置application.yml 配置Nacos的服务地址和application的name
- 2.在主启动类添加注解@EnableDiscoveryClient开启Nacos的服务发现
- 3.启动测试
- 3.配置renren-fast模块
- 1.引入公共模块排除mybatis-plus-boot-starter,获取Nacos依赖
- 2.配置application.yml 配置Nacos的服务地址和application的name
- 3.在主启动类添加注解@EnableDiscoveryClient开启Nacos的服务发现
- 4.启动测试
- 3.创建sunliving-gateway完成路由转发测试
- 1.创建并配置sunliving-gateway模块
- 1.创建sunliving-gateway模块
- 2.检查父子模块
- 2.参考sunliving-service模块引入依赖
- 3.配置Nacos服务发现
- 1.application.yml 配置端口,服务名,Nacos
- 2.编写主启动类,开启服务发现
- 3.启动测试
- 4.配置GateWay完成测试
- 1.测试一
- 1.将请求转发到 http://localhost:9091/commodity/brand/list
- 2.思路分析
- 3.配置方式
- 4.浏览器发送请求 localhost:5050/commodity/brand/list
- 2.测试二
- 1.将请求转发到 https://tieba.baidu.com/index.html
- 2.请求方式 http://localhost:5050/index.html
- 3.配置方式
- 4.结果展示
- 4.完成前端通过GateWay访问后端
- 1.renren-fast 模块配置
- 1.找到前端向这个模块发送请求的前缀(服务发现 + 上下文路径)
- 1.进入adornUrl
- 2.进入baseUrl
- 3.进入index.js的
- 4.找到开发环境的前缀了
- 2.修改前缀为GateWay的服务发现 + "/api" + 后端资源的上下文路径
- 1.renren-fast的上下文路径
- 2.修改请求
- 3.GateWay配置
- 4.测试,出现跨域问题
- 5.gateway添加配置类 SunlivingGatewayCorsConfiguration.java
- 6.再次测试,显示有多个跨域配置,只允许有一个
- 7.删除renren-fast本身的跨域配置,然后再次测试
- 2.关于GateWay的配置
- 1.前端的请求方式
- 2.后端的要求
- 3.GateWay的配置解析
- 4.GateWay配置模板
- 5.注意事项
- 3.sunliving-commodity 模块配置
- 1.application.yml 配置后端项目的上下文路径
- 2.找到前端发送请求的方式
- 1.环境变量 + 资源路径的方法
- 2.找到开发环境的环境变量,修改为GateWay的服务发现 + /api + 目标资源的上下文路径
- 3.进行GateWay的配置(按照模板来即可)
- 4.启动测试
- 1.还是多个跨域配置的问题
- 2.注销sunliving-commodity模块的跨域配置
- 3.重启测试
- 4.目前这种配置方式的分析
- 1.缺点
- 2.改进方式:使用明确的环境变量来区分不同微服务
- 3.修改开发环境的BASEPATH
- 4.将用到这个环境变量的请求替换一下
- 5.重启测试
- 5.设置OSS权限
- 1.如果不希望被读,就将读写权限设置为私有
- 2.控制上传文件权限
- 1.进入RAM控制台
- 2.删除用户即可
- 6.sunliving-service模块的配置
- 1.分析
- 1.这个模块主要是用来返回OSS的签名的,所以只有文件上传部分调用了这个接口
- 2.singleUpload.vue 指定的是对象存储的地址,不需要改
- 3.src/components/upload/policy.js是向后端sunliving-service模块发送的请求,需要区分多环境并交给网关统一控制
- 2.后端 application.yml 配置上下文路径
- 3.前端开发环境配置环境变量,区分多环境
- 4.policy.js 通过环境变量 + 资源路径的方式请求到后端
- 5.配置GateWay
- 6.启动测试
- 1.报错在brower.js:158:202
- 2.进入看看,发现是刚才的环境变量配置的有问题
- 3.修改一下即可
- 4.修改了环境变量需要重启项目,再次测试,此时发现又是跨域配置过多的问题
- 5.把这个sunliving-service的跨域配置注销即可
- 6.再次启动,成功!
- 7.使用GateWay进行路由转发总结
- 1.前提条件:后端配置了上下文路径
- 2.前端发送请求方式
- 3.GateWay配置模板(仅限目前的规范)
- 4.GateWay添加配置类,处理跨域问题(这样其他微服务就不需要处理跨域了)
- 5.关于前端区分多环境的细节说明
- 8.Nacos配置中心的使用
- 1.修改Nacos的密码保证安全
- 2.对sunliving-service的依赖进行版本仲裁
- 3.引入nacos的配置中心依赖
- 4.在Nacos中创建配置文件
- 1.新建命名空间
- 2.进入配置列表,选中刚才的命名空间,点击加号
- 3.进行配置
- 4.将application.yml的部分配置放到配置中心
- 5.点击发布
- 6.查看配置列表
- 5.编写bootstrap.properties来读取配置中心的文件(也可以使用)
- 9.为网关设置配置中心,使其可以动态配置网关信息
- 1.引入nacos的配置中心依赖
- 2.新建命名空间
- 3.新建配置
- 4.查看配置
- 5.创建bootstrap.properties文件,填写信息
- 6.重启测试
- 1.可以读取到端口信息,但是网关配置一直不生效
- 2.把这个application和nacos的服务发现配置也放到配置中心就好了(下次粘贴配置的时候就完整粘贴就好)
1.当前项目架构分析
1.请求多个模块的方式
1.请求renren-fast模块
开发环境
生产环境
2.请求sunliving-commodity模块
1.使用环境变量+资源路径的方式
2.开发环境 dev.env.js
3.生产环境 prod.env.js
3.文件上传请求 sunliving-service模块
1.请求后端接口(开发环境) policy.js
2.请求阿里云OSS
2.架构图
3.加入改进后的架构图
2.将三个微服务注册到Nacos
1.配置Nacos1.1.3到云服务器
1.GitHub下载压缩包
nacos-server-1.1.3.tar.gz
2.上传到宝塔
3.安装JDK8
1.将压缩包放到/opt/jdk下
2.进入/usr/local
3.创建文件夹 java
4.进入/opt/jdk
5.解压缩到/usr/local/java
tar -zxvf jdk-8u261-linux-x64.tar.gz -C /usr/local/java
6.进入 /usr/local/java/jdk1.8.0_261/bin 查看java版本
./java -version
7.准备配置环境变量,复制java的bin目录位置 pwd可以查看当前目录
/usr/local/java/jdk1.8.0_261/bin
8.进入到环境变量的配置文件 vim /etc/profile
,移动到最后,配置环境变量
export JAVA_HOME=/usr/local/java/jdk1.8.0_261
export PATH=$JAVA_HOME/bin:$PATH
9.刷新环境变量使其生效,然后输出一下查看
source /etc/profile
echo $PATH
10.输入 java -version,成功!
4.安装目录一般在 /usr/local 目录下,我们可以在此目录下新建一个目录nacos
cd /usr/local
mkdir nacos
5.进入这个软件目录
cd /www/nacos1.1.3/
6.解压缩到/usr/local下的nacos目录
tar -zxvf nacos-server-1.1.3.tar.gz -C /usr/local/nacos/
7.配置nacos的端口
1.进入nacos的conf目录
2.将cluster.conf.example文件复制命名为cluster.conf
cp cluster.conf.example cluster.conf
3.编辑这个文件,设置ip和端口,可以配置多个
vim cluster.conf
8进入安装目录 /usr/local/nacos/nacos/bin
9.执行nacos
./startup.sh
10.宝塔和腾讯云都要开放8848端口
11.访问 http://ip:8848/nacos 用户名和密码都是nacos
12.nacos常用命令
1.查看所有开放端口 firewall-cmd --list-all
2.查看8848端口是否被占用 netstat -tulnp | grep 8848
3.查看nacos进程 ps -ef | grep nacos
4.重启nacos(修改配置文件之后重启)
./startup.sh -m standalone
2.配置sunliving-common模块引入Nacos依赖
1.使用dependencyManagement对本模块以及子模块进行版本仲裁
<!-- 对本模块以及子模块进行版本仲裁 --><dependencyManagement><dependencies><!-- 指定spring-cloud-alibaba-dependencies的版本为2.1.0,对本模块以及子模块进行版本仲裁 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.1.0.RELEASE</version> <!-- 确保这里的版本号是正确的 --><!-- 这里的type是pom,scope是import,表示这个依赖是导入依赖,不会参与编译和打包,可以解决单继承问题 --><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>
2.引入Nacos的依赖
<!-- 引入nacos服务注册和发现 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><!-- <version>2.1.0.RELEASE</version> 这里使用版本仲裁--></dependency>
3.目前状态
- sunliving-common模块的Nacos版本被自己版本仲裁了为2.1.0
- sunliving-commodity和sunliving-service引入了sunliving-common模块所以也有Nacos2.1.0依赖
3.三个模块配置Nacos
1.sunliving-commodity模块配置Nacos
1.application.yml 配置Nacos的服务地址和application的name
2.在主启动类添加注解@EnableDiscoveryClient开启Nacos的服务发现
3.确保Nacos启动,然后启动这个模块,访问 http://ip:8848/nacos 注册成功!
2.sunliving-service模块配置Nacos
1.配置application.yml 配置Nacos的服务地址和application的name
2.在主启动类添加注解@EnableDiscoveryClient开启Nacos的服务发现
3.启动测试
3.配置renren-fast模块
1.引入公共模块排除mybatis-plus-boot-starter,获取Nacos依赖
<!-- 公共模块 --><dependency><groupId>com.sun.sunliving</groupId><artifactId>sunliving-common</artifactId><version>1.0-SNAPSHOT</version><exclusions><exclusion><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId></exclusion></exclusions></dependency>
2.配置application.yml 配置Nacos的服务地址和application的name
3.在主启动类添加注解@EnableDiscoveryClient开启Nacos的服务发现
4.启动测试
3.创建sunliving-gateway完成路由转发测试
1.创建并配置sunliving-gateway模块
1.创建sunliving-gateway模块
2.检查父子模块
2.参考sunliving-service模块引入依赖
<!-- 添加描述信息 --><description>sun(家居生活)-网关服务</description><!-- 导入SpringBoot父工程 --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.8.RELEASE</version><relativePath/> <!-- 当parent的groupId没有指向父工程时就需要加 --></parent><properties><java.version>1.8</java.version><!-- SpringCloud版本 2020.0.5--><spring-cloud.version>Greenwich.SR3</spring-cloud.version><!-- 解决java: -source 1.5 中不支持 diamond 运算符 问题 --><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><!-- 这里直接获取properties里面的版本号 --><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><!-- SpringCloud网关模块 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId><!-- <version>2.2.1.RELEASE</version> 使用版本仲裁--></dependency><!-- SpringBoot web模块必须拿掉,否则会报错!!! --><!-- <dependency> --><!-- <groupId>org.springframework.boot</groupId> --><!-- <artifactId>spring-boot-starter-web</artifactId> --><!-- </dependency> --><!-- SpringBoot test模块 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- 公共模块 --><dependency><groupId>com.sun.sunliving</groupId><artifactId>sunliving-common</artifactId><version>1.0-SNAPSHOT</version><!-- 排除mybatis-plus-boot-starter, 因为不使用,就不会配置application.yml的mybatis-plus的部分,不排除会报错 --><exclusions><exclusion><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId></exclusion></exclusions></dependency></dependencies><!-- maven打包常规配置 --><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
3.配置Nacos服务发现
1.application.yml 配置端口,服务名,Nacos
server:port: 5050
spring:application:name: sunliving-gateway # Name of the applicationcloud:nacos:discovery:server-addr: ip:8848 # nacos服务地址
2.编写主启动类,开启服务发现
package com.sun.sunliving.gateway;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;/*** Description:** @Author sun* @Create 2024/4/14 20:40* @Version 1.0*/
@SpringBootApplication
@EnableDiscoveryClient // 开启服务注册与发现
public class SunlivingGateWayApplication {public static void main(String[] args) {SpringApplication.run(SunlivingGateWayApplication.class, args);}
}
3.启动测试
4.配置GateWay完成测试
1.测试一
1.将请求转发到 http://localhost:9091/commodity/brand/list
2.思路分析
-
请求方式:服务发现 + 上下文路径 + 资源路径
-
这里要想通过GateWay请求到这个网址,请求方式为GateWay服务发现 + 目标的上下文路径 + 资源路径
-
所以请求方式=http://localhost:5050/commodity/brand/list
-
uri的编写就是目标的服务发现
-
断言的编写方式为目标的上下文路径+资源路径,
-
一旦断言成功,就会按照uri与断言的路径拼接也就是目标的服务发现 + 上下文路径 + 资源路径
3.配置方式
gateway: # Gateway configurationroutes: # 可以有多个路由- id: test_routes # Route ID 保证唯一即可uri: lb://sunliving-commodity # Target servicepredicates: # Predicates- Path=/commodity/brand/**
4.浏览器发送请求 localhost:5050/commodity/brand/list
2.测试二
1.将请求转发到 https://tieba.baidu.com/index.html
2.请求方式 http://localhost:5050/index.html
3.配置方式
- id: sunliving-orderuri: https://tieba.baidu.compredicates:- Path=/index.html
4.结果展示
4.完成前端通过GateWay访问后端
1.renren-fast 模块配置
1.找到前端向这个模块发送请求的前缀(服务发现 + 上下文路径)
1.进入adornUrl
2.进入baseUrl
3.进入index.js的
4.找到开发环境的前缀了
2.修改前缀为GateWay的服务发现 + “/api” + 后端资源的上下文路径
1.renren-fast的上下文路径
2.修改请求
3.GateWay配置
gateway: # Gateway configurationroutes: # 可以有多个路由- id: renren-fast # Route ID 保证唯一即可uri: lb://renren-fast # 服务发现predicates: # Predicates- Path=/api/renren-fast/** # 这里将得到的请求路径断言一下filters: # 重写路径,将/api/renren-fast/xxx重写为/renren-fast/xxx,此时与上面的服务发现拼接,得到最终的请求路径,也就是把/api拿掉- RewritePath=/api/(?<segment>.*), /$\{segment}
4.测试,出现跨域问题
5.gateway添加配置类 SunlivingGatewayCorsConfiguration.java
package com.sun.sunliving.gateway.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
// 注意这个包别引错了
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;/*** Description:** @Author sun* @Create 2024/4/15 10:17* @Version 1.0*/
@Configuration
public class SunlivingGatewayCorsConfiguration {@Beanpublic CorsWebFilter corsWebFilter() {System.out.println("enter....");UrlBasedCorsConfigurationSource source = newUrlBasedCorsConfigurationSource();CorsConfiguration corsConfiguration = new CorsConfiguration();// 1、配置跨域corsConfiguration.addAllowedHeader("*");corsConfiguration.addAllowedMethod("*");corsConfiguration.addAllowedOrigin("*");corsConfiguration.setAllowCredentials(true);source.registerCorsConfiguration("/**", corsConfiguration);return new CorsWebFilter(source);}
}
6.再次测试,显示有多个跨域配置,只允许有一个
7.删除renren-fast本身的跨域配置,然后再次测试
2.关于GateWay的配置
1.前端的请求方式
- GateWay的服务发现 + /api + 目标资源的上下文路径 + 资源路径
2.后端的要求
- 统一设置上下文路径,便于管理
3.GateWay的配置解析
- uri 配置的目标资源的服务发现
- predicates 断言 /api + 目标资源的上下文路径 + 资源路径 需要得到 目标资源的上下文路径 + 资源路径
- 所以需要将/api去掉 (?.*) 表示/api后面的部分,会填充到这个标签中/$\{segment} 这样就得到了目标资源的上下文路径 + 资源路径
- 最后会将目标资源的服务发现 + 上下文路径 + 资源路径拼接,最终找到资源
- 注意segment可以换名称只需要保证两个的名字相同即可
gateway: # Gateway configurationroutes: # 可以有多个路由- id: renren-fast # Route ID 保证唯一即可uri: lb://renren-fast # 服务发现predicates: # Predicates- Path=/api/renren-fast/** # 这里将得到的请求路径断言一下filters: # 重写路径,将/api/renren-fast/xxx重写为/renren-fast/xxx,此时与上面的服务发现拼接,得到最终的请求路径,也就是把/api拿掉- RewritePath=/api/(?<segment>.*), /$\{segment}
4.GateWay配置模板
gateway: # Gateway 配置routes: # 可以有多个路由- id: renren-fast # 保证唯一即可uri: lb://目标资源的application名称 # 服务发现,lb:表示负载均衡predicates: # 断言- Path=/api/目标资源上下文路径/** filters: # 重写路径,将/api/上下文路径/** 转换为 /上下文路径/**- RewritePath=/api/(?<segment>.*), /$\{segment}
5.注意事项
如果在配置中有一个更精确的路径断言应该放到前面否则会报错
3.sunliving-commodity 模块配置
1.application.yml 配置后端项目的上下文路径
2.找到前端发送请求的方式
1.环境变量 + 资源路径的方法
2.找到开发环境的环境变量,修改为GateWay的服务发现 + /api + 目标资源的上下文路径
3.进行GateWay的配置(按照模板来即可)
- id: sunliving-commodity # 保证唯一即可uri: lb://sunliving-commodity # 服务发现,lb:表示负载均衡predicates: # 断言- Path=/api/sunliving-commodity/**filters: # 重写路径,将/api/上下文路径/** 转换为 /上下文路径/**- RewritePath=/api/(?<segment>.*), /$\{segment}
4.启动测试
1.还是多个跨域配置的问题
2.注销sunliving-commodity模块的跨域配置
3.重启测试
4.目前这种配置方式的分析
1.缺点
- 目前的环境变量 + 资源路径的方式,一旦新增加一个微服务,就需要新增一个环境变量,但是目前使用BASEPATHD的方式就很难区分
2.改进方式:使用明确的环境变量来区分不同微服务
3.修改开发环境的BASEPATH
4.将用到这个环境变量的请求替换一下
- category.vue
- brand.vue
- brand-add-or-update.vue
5.重启测试
5.设置OSS权限
1.如果不希望被读,就将读写权限设置为私有
2.控制上传文件权限
1.进入RAM控制台
2.删除用户即可
6.sunliving-service模块的配置
1.分析
1.这个模块主要是用来返回OSS的签名的,所以只有文件上传部分调用了这个接口
2.singleUpload.vue 指定的是对象存储的地址,不需要改
3.src/components/upload/policy.js是向后端sunliving-service模块发送的请求,需要区分多环境并交给网关统一控制
2.后端 application.yml 配置上下文路径
3.前端开发环境配置环境变量,区分多环境
- 环境变量配置为 GateWay服务发现 + /api + 上下文路径
4.policy.js 通过环境变量 + 资源路径的方式请求到后端
5.配置GateWay
- id: sunliving-service # 保证唯一即可uri: lb://sunliving-service # 服务发现,lb:表示负载均衡predicates: # 断言- Path=/api/sunliving-service/**filters: # 重写路径,将/api/上下文路径/** 转换为 /上下文路径/**- RewritePath=/api/(?<segment>.*), /$\{segment}
6.启动测试
1.报错在brower.js:158:202
2.进入看看,发现是刚才的环境变量配置的有问题
3.修改一下即可
4.修改了环境变量需要重启项目,再次测试,此时发现又是跨域配置过多的问题
5.把这个sunliving-service的跨域配置注销即可
6.再次启动,成功!
7.使用GateWay进行路由转发总结
1.前提条件:后端配置了上下文路径
2.前端发送请求方式
- GateWay服务发现 + /api + 目标资源的上下文路径 + 资源路径
- 注意:这个/api是自定义的规范,不是必须的,也可以有其他的方式
3.GateWay配置模板(仅限目前的规范)
gateway: # Gateway 配置routes: # 可以有多个路由- id: renren-fast # 保证唯一即可uri: lb://目标资源的application名称 # 服务发现,lb:表示负载均衡predicates: # 断言- Path=/api/目标资源上下文路径/** filters: # 重写路径,将/api/上下文路径/** 转换为 /上下文路径/**- RewritePath=/api/(?<segment>.*), /$\{segment}
4.GateWay添加配置类,处理跨域问题(这样其他微服务就不需要处理跨域了)
package com.sun.sunliving.gateway.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;/*** Description:** @Author sun* @Create 2024/4/15 10:17* @Version 1.0*/
@Configuration
public class SunlivingGatewayCorsConfiguration {@Beanpublic CorsWebFilter corsWebFilter() {System.out.println("enter....");UrlBasedCorsConfigurationSource source = newUrlBasedCorsConfigurationSource();CorsConfiguration corsConfiguration = new CorsConfiguration();// 1、配置跨域corsConfiguration.addAllowedHeader("*");corsConfiguration.addAllowedMethod("*");corsConfiguration.addAllowedOrigin("*");corsConfiguration.setAllowCredentials(true);source.registerCorsConfiguration("/**", corsConfiguration);return new CorsWebFilter(source);}
}
5.关于前端区分多环境的细节说明
- 首先查看所有的后端模块,一个一个看,找到每一个模块对应的所有前端请求
- 对于前端请求使用环境变量 + 资源路径的方式区分多环境
- 一个微服务模块配置一个环境变量,内容为GateWay服务发现 + /api + 上下文路径 这样再加上资源路径,就可以访问到目标资源
8.Nacos配置中心的使用
1.修改Nacos的密码保证安全
2.对sunliving-service的依赖进行版本仲裁
<!-- 对本模块以及子模块进行版本仲裁 --><dependencyManagement><dependencies><!-- 指定spring-cloud-alibaba-dependencies的版本为2.1.0,对本模块以及子模块进行版本仲裁 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.1.0.RELEASE</version> <!-- 确保这里的版本号是正确的 --><!-- 这里的type是pom,scope是import,表示这个依赖是导入依赖,不会参与编译和打包,可以解决单继承问题 --><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>
3.引入nacos的配置中心依赖
<!-- 引入nacos的配置中心依赖 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency>
4.在Nacos中创建配置文件
1.新建命名空间
2.进入配置列表,选中刚才的命名空间,点击加号
3.进行配置
4.将application.yml的部分配置放到配置中心
5.点击发布
6.查看配置列表
5.编写bootstrap.properties来读取配置中心的文件(也可以使用)
#注册到 nacos 的名字
spring.application.name=sunliving-service
#指定 nacos 的发现注册地址
spring.cloud.nacos.discovery.server-addr=ip:8848
#指定 nacos 的配置地址
spring.cloud.nacos.config.server-addr=ip:8848
#要获取的配置文件所在的配置空间
spring.cloud.nacos.config.namespace=830a1d44-4c4a-d708a9548c1c
#配置空间的哪一个组, 这个组下可以有多个配置文件,通过 ext-config[?] 来指定要加载某空间下的某组的第几个文件
spring.cloud.nacos.config.group=dev
#通过 ext-config[?] 来指定要加载某空间下的某组的第几个文件
spring.cloud.nacos.config.ext-config[0].data-id=application.yml
spring.cloud.nacos.config.ext-config[0].group=dev
spring.cloud.nacos.config.ext-config[0].refresh=true
9.为网关设置配置中心,使其可以动态配置网关信息
1.引入nacos的配置中心依赖
<!-- 引入nacos的配置中心依赖 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><version>2.1.0.RELEASE</version></dependency>
2.新建命名空间
3.新建配置
4.查看配置
5.创建bootstrap.properties文件,填写信息
#注册到 nacos 的名字
spring.application.name=sunliving-gateway
#指定 nacos 的发现注册地址
spring.cloud.nacos.discovery.server-addr=ip:8848
#指定 nacos 的配置地址
spring.cloud.nacos.config.server-addr=ip:8848
#要获取的配置文件所在的配置空间
spring.cloud.nacos.config.namespace=10f6a704-5d7f82519ba4
#配置空间的哪一个组, 这个组下可以有多个配置文件,通过 ext-config[?] 来指定要加载某空间下的某组的第几个文件
spring.cloud.nacos.config.group=DEFAULT_GROUP
#通过 ext-config[?] 来指定要加载某空间下的某组的第几个文件
spring.cloud.nacos.config.ext-config[0].data-id=application.yml
spring.cloud.nacos.config.ext-config[0].group=DEFAULT_GROUP
spring.cloud.nacos.config.ext-config[0].refresh=true
6.重启测试
1.可以读取到端口信息,但是网关配置一直不生效
2.把这个application和nacos的服务发现配置也放到配置中心就好了(下次粘贴配置的时候就完整粘贴就好)
相关文章:

Nacos+GateWay 搭建微服务架构
文章目录 1.当前项目架构分析1.请求多个模块的方式1.请求renren-fast模块开发环境生产环境 2.请求sunliving-commodity模块1.使用环境变量资源路径的方式2.开发环境 dev.env.js3.生产环境 prod.env.js 3.文件上传请求 sunliving-service模块1.请求后端接口(开发环境…...

【2024华为HCIP831 | 高级网络工程师之路】刷题日记(18)
个人名片:🪪 🐼作者简介:一名大三在校生,喜欢AI编程🎋 🐻❄️个人主页🥇:落798. 🐼个人WeChat:hmmwx53 🕊️系列专栏:&a…...

在抖音做电商,没有货源,不懂直播怎么办?分享一种解决方案!
大家好,我是电商糖果 糖果做电商的时间也挺久了,天猫,京东,闲鱼都搞过。 从学校进入社会工作,创业,一直都是围绕电商打转。 做的时间久了,好像只会做这一件事儿了。 2020年开始专攻抖音小店&…...

基于单片机的智能安防系统设计(32+4G+WIFI版)-设计说明书
设计摘要: 本设计基于STM32单片机,旨在实现一个智能安防系统,主要包括烟雾和温度传感器、人体红外传感器、显示屏、按键、4G模块和WiFi模块等组件。通过这些组件的协作,实现了火灾检测、入侵监测、状态显示、用户交互和远程通信等…...
云服务器配置mysql允许被远程连接从而使用图形化界面
介绍 在云服务器上搭建和配置数据库是进行网站和应用开发的关键步骤之一。本文将介绍如何在云服务器上设置 MySQL 8 和 MySQL 5,以允许远程连接,从而让你的数据库能够被远程用户访问。这样你的本机就可以访问linux服务器上的mysql能,就可以使…...

【软件测试】需求概念|软件的⽣命周期|开发模型|测试模型
目录 推荐 一、什么是需求 1.1 ⽤⼾需求 1.2 软件需求 二、开发模型 2.1 什么是“模型” 2.2 软件的⽣命周期 2.3 常⻅开发模型 2.3.1 瀑布模型 2.3.2 螺旋模型 2.3.3 增量模型、迭代模型 2.3.4 敏捷模型 2.4 测试模型 2.4.1 V模型 2.4.2 W模型(双V模型࿰…...
SQL中的LAG函数与LEAD函数用法
LAG:函数用于获取结果集中当前行之前的某一行的值 LAG (scalar_expression [,offset] [,default]) OVER ([partition_by_clause ] order_by_clause ) -----汉字解释 LAG (字段 [,偏移量默认为1] [,如果没有值时候默认值]) OVER ( [ partition_by 字段 ] order_by 字…...

数据结构------二叉树经典习题1
博主主页: 码农派大星. 关注博主带你了解更多数据结构知识 1判断相同的树 OJ链接 这道题相对简单,运用我们常规的递归写法就能轻松写出 所以我们解题思路应该这样想: 1.如果p为空,q为空,那么就是两颗空树肯定相等 2.如果一个树为空另一棵树不为空那么…...

汇聚荣:拼多多长期没有流量如何提高?
在电商的海洋中,拼多多以其独特的团购模式吸引了众多消费者的目光。然而,随着市场竞争的加剧和消费者需求的多样化,一些商家发现自家店铺的流量持续低迷,销售业绩难以突破。面对这样的挑战,如何有效提升拼多多店铺的客…...

Chrome的常用操作总结
Chrome的常用操作总结 最近的自己真的好忙啊,好久真好久没有写博客了,今天我就趁着周末的这段时间总结一下最近自己的用的Chrome浏览器常用的命令 不得不说: 就是特么的丝滑!吊打一切浏览器(不接受反驳哈哈哈)因为反驳我也不听嘻嘻 用好快捷键,就是事半功倍!!!重要的事儿说一遍…...

dvwa靶场 JavaScript Attacks(js攻击)全难度教程(附代码分析)
JS简介 一种解释型语言(代码不需要编译),一般镶嵌在html或者php中实现。 JavaScript Attacks(Security Level: low) 代码分析 <?php $page[ body ] . <<<EOF <script>/* MD5 code from here h…...
Flutter 中的 checkboxListTile 小部件:全面指南
Flutter 中的 checkboxListTile 小部件:全面指南 在Flutter的Material组件库中,CheckboxListTile是一个特殊的ListTile,它内嵌了一个复选框(Checkbox)。这使得它非常适合用来创建一个带有标题和可选复选框的列表项&am…...

前馈神经网络FNN、多层感知机MLP和反向传播推导
目录 一、前馈神经网络FNN 激活函数的使用 二、多层感知机MLP MLP的典型结构 多层感知机MLP的特点 和前馈神经网络FNN的区别 三、传播推导 1、前向传播(Forward propagation) (1)输入层到隐藏层 (2)隐藏层到输出层 2、…...
QML笔记八
QML与C交互 QML中调用C功能、使用QML或者Quick中的C接口、使用C实现自定义的QML对象 注: 只有QObject的派生类才能与QML交互 QML引擎集成Qt元对象系统,QObject的派生子类的属性、方法、信号都可以在QML中访问 C类可以被注册为一个QML实例 C类可以被注册为…...
运维别卷系列 - 云原生监控平台 之 00.prometheus 监控汇总
以下是 运维别卷系列 - 云原生监控平台 相关的详细文章链接,相应的内容,也只是用来做入门使用的 运维别卷系列 - 云原生监控平台 之 01.prometheus 入门和部署运维别卷系列 - 云原生监控平台 之 02.prometheus exporter 实践运维别卷系列 - 云原生监控平…...

信息系统安全与对抗-网络侦查技术与网络扫描技术(期末复习简答题)
1、网络拓扑结构在网络攻击中的作用 查明目标网络的拓扑结构,有利于找到目标网络的关键节点,从而提高攻击效率,达到最大攻击效果。 2、网络侦查在网络攻击中的作用 识别潜在目标系统,确认目标系统适合哪种类型的攻击。 3、百度…...

【python量化交易】—— Alpha选股策略 - Qteasy自定义交易策略【附源码】
使用qteasy创建并回测Alpha选股交易策略 使用qteasy创建并回测Alpha选股交易策略策略思想第一种自定义策略设置方法,使用持仓数据和选股数据直接生成比例交易信号PS信号:第二种自定义策略设置方法,使用PT交易信号设置持仓目标:第三…...

简单记录下:Navicat 导出表结构至 Excel
首先我们需要通过sql语句查询出相关的表结构的结构 SELECT COLUMN_NAME AS 字段名称,COLUMN_TYPE AS 字段类型,IF(IS_NULLABLENO,否,是) AS 是否必填,COLUMN_COMMENT AS 注释FROM INFORMATION_SCHEMA.COLUMNSWHERE table_schema bs-gdsAND table_name sys_menu;查询的结构如下…...

黑马基于Web-socket的java聊天室基本解析
要是用Web-socket协议,我们要前端upgrade升级成web-socket协议 首先我们要引入springboot的websocket起步依赖,这样子方便使用,自己指定版本注意 <dependency><groupId>org.springframework.boot</groupId><artifactId&…...

【操作系统期末速成】内存管理|内存的装入模块在装入内存的方式|分配管理方式|页面置换算法|页面置换
🎥 个人主页:深鱼~🔥收录专栏:操作系统🌄欢迎 👍点赞✍评论⭐收藏 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...

MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...