96SEO 2026-02-19 21:35 7
是一个强大的工具它不仅简化了微服务间的通信还增强了系统的安全性、稳定性和可扩展性。

对于任何采用微服务架构的应用程序来说它都是不可或缺的一部分。
!--网关--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-gateway/artifactId/dependency!--服务发现中心--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-config/artifactId/dependency
gatewaycloud:nacos:server-addr:
124.70.208.223:8848discovery:namespace:
服务发现的组名用于进一步隔离服务config:namespace:
logging-${spring.profiles.active}.yamlrefresh:
在nacos配置中心中进行远程配置所有的网关相关配置全部配置到nacos中创建gateway-dev.yaml
uri路由目标地址lb://代表负载均衡从注册中心获取目标微服务的实例列表并且负载均衡选择一个访问。
After2037-01-20T17:42:47.789-07:00[America/Denver]
Before2031-04-13T15:14:47.43308:00[Asia/Shanghai]
Between2037-01-20T17:42:47.789-07:00[America/Denver],
2037-01-21T17:42:47.789-07:00[America/Denver]
Host**.somehost.org,**.ano***rhost.org
在网关处在filter包中实现GlobalFilter接口配置全局过滤器实现
在过滤器中首先获取需要放行的路径在配置文件中定义AuthProperties
如果该路径在配置文件中没有定义都需要拦截首先获取请求头中的authorization拿到token值进行解析。
拿到用户的id。
将用户的id放到请求头中user-info,转发给其他的微服务
com.hmall.gateway.filter;import
com.hmall.common.exception.UnauthorizedException;
com.hmall.common.utils.CollUtils;
com.hmall.common.utils.UserContext;
com.hmall.gateway.config.AuthProperties;
com.hmall.gateway.util.JwtTool;
lombok.RequiredArgsConstructor;
org.springframework.boot.context.properties.EnableConfigurationProperties;
org.springframework.cloud.gateway.filter.GatewayFilterChain;
org.springframework.cloud.gateway.filter.GlobalFilter;
org.springframework.core.Ordered;
org.springframework.http.server.reactive.ServerHttpRequest;
org.springframework.http.server.reactive.ServerHttpResponse;
org.springframework.stereotype.Component;
org.springframework.util.AntPathMatcher;
org.springframework.web.server.ServerWebExchange;
reactor.core.publisher.Mono;import
EnableConfigurationProperties(AuthProperties.class)
AntPathMatcher();Overridepublic
2.判断是否不需要拦截if(isExclude(request.getPath().toString())){//
request.getHeaders().get(authorization);if
exchange.getResponse();response.setRawStatusCode(401);return
userId.toString();System.out.println(userIduserInfo);ServerWebExchange
exchange.mutate().request(builder
chain.filter(exchange);}private
authProperties.getExcludePaths())
{if(antPathMatcher.match(pathPattern,
上面我们已经在网关过滤器中获取请求头中的token解析出用户id放回请求头user-info中传递给各个微服务。
但通过openFeign发起的请求中并没有通过网关请求中没有携带user-info。
所以我们需要配置openFeign拦截器拿到用户id并放到请求头中转发给其他微服务
com.hmall.common.utils.UserContext;
org.springframework.context.annotation.Bean;public
userInfoRequestInterceptor(){return
UserContext.getUser();if(userId
如果不为空则放入请求头中传递给下游微服务template.header(user-info,
配置完成后需要在使用了openFeign微服务的启动类上加上EnableFeignClients注解激活拦截器
EnableFeignClients(basePackages
EnableFeignClients(basePackages
MapperScan(com.hmall.pay.mapper)
{SpringApplication.run(PayApplication.class,
在网关和OpenFeign中我们已经将用户id放到了请求头user-info中而所有的微服务都需要依赖常量模块common故我们在common模块中定义SpringMVC拦截器获取userId保存到TreadLocal中。
这里可能有人会问为什么不在网关过滤器中直接将用户id保存在TreadLocal中呢而是放到请求头中在common模块中定义拦截器拿到用户id在保存TreadLocal中。
这就不得不提一下TreadLocal的特性了
中的一个工具它为每个线程提供独立的变量副本使得同一个线程在不同地方访问
变量时都能得到相同的数据而不同线程之间不会相互影响。
然而ThreadLocal
在微服务架构中网关和各个微服务通常是独立部署的应用程序它们可能运行在不同的进程中甚至是在不同的服务器上。
因此当你在一个微服务如网关中使用
com.hmall.common.utils.UserContext;
org.springframework.web.servlet.HandlerInterceptor;import
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;public
request.getHeader(user-info);//
不为空保存到ThreadLocalUserContext.setUser(Long.valueOf(userInfo));}//
afterCompletion(HttpServletRequest
com.hmall.common.interceptors.UserInfoInterceptor;
org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
org.springframework.context.annotation.Configuration;
org.springframework.web.servlet.DispatcherServlet;
org.springframework.web.servlet.config.annotation.InterceptorRegistry;
org.springframework.web.servlet.config.annotation.WebMvcConfigurer;Configuration
ConditionalOnClass(DispatcherServlet.class)
addInterceptors(InterceptorRegistry
不过需要注意的是这个配置类默认是不会生效的因为它所在的包是common模块因为common模块中的扫描包路径与其它微服务的扫描包不一致且常量模块中没有单独的SpringBootApplication启动类无法被扫描到因此无法生效。
基于SpringBoot的自动装配原理我们要将其添加到resources目录下的META-INF/spring.factories文件中
org.springframework.boot.autoconfigure.EnableAutoConfiguration\com.hmall.common.config.MyBatisConfig,\com.hmall.common.config.MvcConfig,\com.hmall.common.config.JsonConfig
ConditionalOnClass(DispatcherServlet.class)
用于自动配置类中以确保该拦截器只有在处理http请求时才生效拦截。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback