当前位置: 首页 > news >正文 网站的前台后台网站怎么做app news 2025/11/6 6:20:34 网站的前台后台,网站怎么做app,商标注册网app,室内装饰网站模板Spring Cloud微服务网关技术介绍 单体项目拆分微服务后的问题 服务地址问题#xff1a;单体项目端口固定#xff08;如黑马商城为8080#xff09;#xff0c;拆分微服务后端口各异#xff08;如购物车808、商品8081、支付8086等#xff09;且可能变化#xff0c;前端难…Spring Cloud微服务网关技术介绍 单体项目拆分微服务后的问题 服务地址问题单体项目端口固定如黑马商城为8080拆分微服务后端口各异如购物车808、商品8081、支付8086等且可能变化前端难以确定请求的服务地址及应对变化。登录校验问题单体项目登录校验后所有功能可获取用户信息拆分后若各微服务都做登录校验代码重复度高且分发密钥风险大。 网关解决方案及作用 网关功能概述网关负责请求路由转发和身份校验类似小区看门大爷住户类比微服务。前端只需知网关地址设为8080所有请求发往网关后网关根据请求路由至相应微服务如查商品路由到商品微服务查用户路由到用户微服务并在路由前校验用户身份登录则解析获取用户信息并向后传递避免微服务重复校验同时保护微服务使前端开发体验与单体架构一致成为微服务开发必备组件。路由转发与微服务地址获取网关通过注册中心获取微服务地址微服务启动时注册信息到注册中心网关启动后拉取地址变更时注册中心推送。微服务多实例部署时网关利用负载均衡算法挑选实例转发请求。 Spring Cloud网关组件 网关路由转发功能介绍与入门案例规划 核心功能阐述网关主要有两个核心功能一是对前端请求进行路由转发二是对用户身份进行校验本节课主要学习路由转发功能。路由转发流程分析由于微服务拆分前端难以知晓请求对象网关作为微服务群入口可从注册中心获取服务地址前端请求网关后网关判断应由哪个微服务处理路由再从注册中心拉取实例列表并负载均衡挑选实例发送请求转发。入门案例步骤规划创建网关服务实现路由转发分为四步重点是路由规则配置包括创建新项目模块、引入网关相关依赖、编写启动类、配置路由规则其中前三步是创建网关微服务依赖坐标可复制本节课重点学习路由规则配置。 Spring Cloud网关路由特殊配置 网关路由特殊配置引入 背景上节课学习了网关路由规则基本配置能满足多数开发需求但特殊复杂需求需特殊路由配置。路由配置类网关路由配置由RouteDefinition类读写常见四个属性ID是路由唯一标识URI是目标服务地址配置方式与上节课基本一致重点关注路由断言predicates和路由过滤器filters属性。 路由断言 作用判断请求是否符合规则符合则路由到对应目标地址。断言方式 Spring内部提供12种如按请求路径匹配的Path、按时间判断的After和Before与After相反、按请求头、cookie、请求方式等匹配。语法与上节课类似路径规则中{}为占位符一般按/开头后接*的方式配置。 配置方式可参考官网spring cloud gateway中的Route Predicate Factory部分路由断言由工厂类处理工厂名以RoutePredicateFactory为后缀以路由规则名字为前缀官网有详细示例。 路由过滤器 作用对进入网关的前端请求和微服务响应结果进行加工处理。过滤器种类及示例 Spring提供30多种如AddRequestHeader添加请求头、RemoveRequestHeader移除请求头、AddResponseHeader添加响应头、RemoveResponseHeader移除响应头、RewritePath重写请求路径、StripPrefix去除请求路径中的N段前缀等。以StripPrefix为例可解决前端请求路径与微服务路径不一致问题如前端请求路径含/API前缀微服务路径无此前缀可通过StripPrefix去除前缀使路由正确。 配置语法与路由断言类似如AddRequestHeader过滤器等号左边为过滤器名字右边为以逗号隔开的键值形式参数请求头的key和value。演示示例以添加请求头过滤器AddRequestHeader为例在idea中操作在商品微服务路由下添加filters具体配置可参考源码或直接复制粘贴如添加名为truth的请求头值为anyone Long press like button will be rich在商品微服务controller中利用RequestHeader注解获取请求头并打印设置required false测试时先重启网关和商品服务访问网关后查看idea中是否成功打印出添加的请求头内容以此验证过滤器生效。 默认过滤器配置 配置方法若希望过滤器对所有路由生效可配置在defaultFilter下与路由同级无需在每个路由中单独配置。验证测试测试时仅需重启网关再次访问网关查看是否能获取到请求头以此验证默认过滤器对所有路由生效。 网关实现登录校验功能的分析与思路 登录授权功能部署采用JWT登录登录授权功能置于user service用户微服务登录后颁发JWT token可从token解析用户信息。多微服务对用户信息的需求及校验问题多个微服务如购物车服务、交易服务需知晓登录用户信息若在各微服务分别进行JWT校验会导致代码重复且增加密钥泄露风险因此考虑在网关进行校验并向后传递用户信息。校验时机的重要性JWT校验必须在网关将请求转发到微服务之前完成否则校验失去意义。 网关底层处理流程剖析 路由规则判断网关底层基于路由规则判断前端请求应由哪个微服务处理此过程由handler mapping接口默认实现为root predicted handler mapping基于路由断言完成路由规则匹配找到符合请求的路由后存入上下文并转交给web handler接口。过滤器链的形成与作用web handler接口默认实现为filtering web handler找到当前请求对应路由生效的过滤器排序形成过滤器链依次调用。过滤器链中的netty routine filter默认对所有路由生效且在最后执行负责将请求转发到微服务微服务执行完返回结果后它进行封装并存入上下文再依次返回给其他过滤器和用户。过滤器的PRE和POST逻辑过滤器内部有PRE和POST两部分逻辑请求进入先执行PRE逻辑若失败则结束成功才继续调用下一个过滤器的PRE逻辑执行到netty routine filter的PRE逻辑时将请求转发到微服务微服务执行完进入POST阶段结果经netty routine filter封装存入上下文后依次返回给上一个过滤器PRE阶段按顺序执行POST阶段倒序执行。 网关转发前校验方案及用户信息传递问题 自定义过滤器实现校验需在网关内自定义过滤器保证其执行顺序在netty routine filter之前在PRE逻辑里实现JWT校验从而确保转发前完成校验。网关与微服务间用户信息传递方式网关校验得到用户信息后将用户信息放入请求头传递给微服务。微服务之间用户信息传递问题及差异复杂业务中微服务间相互调用如交易服务调用购物车服务时也需传递用户信息虽同样基于HTTP请求但实现方式与网关到微服务传递有所不同因为微服务间的HTTP请求基于open feign发起而网关到微服务是网关内置的请求方式。 网关过滤器自定义及登录校验逻辑实现 网关过滤器种类 gateway filter 之前在学习网关路由时见过在路由配置属性中有filters其可指定过滤器及参数。过滤器约30多种默认不生效可配置到特定路由或default filter下针对指定路由或所有路由生效灵活性高能任意指定作用范围。 global filter全局过滤器 作用范围是所有路由进入网关的请求都会被处理无需指定或选择声明后自动生效使用更简单。两种过滤器的filter方法在返回值、方法名和方法参数上完全一样该方法是编写过滤逻辑的核心编写登录校验逻辑时方法差别不大以global filter为例解读方法信息。 过滤器方法参数及返回值以global filter为例 方法参数 server web exchange网关内部上下文对象用于保存网关内部共享数据如request、response、session等过滤器链中所有过滤器可从中读取和存入数据。gateway filter chain过滤器链自定义过滤器业务逻辑处理完后调用它来调用下一个过滤器使整个链条串联。 返回值 返回值为mono网关过滤器内部分为PRE和post两部分逻辑实现filter方法后写的业务属于PRE部分。PRE执行完调用chain调用下一个过滤器所有过滤器PRE执行完后将请求转发到微服务微服务返回结果才执行post部分。 定义global filter示例 定义一个类实现global filter接口加上component注解注册为spring bean实现filter方法编写PRE逻辑如模拟登录校验逻辑先获取请求头这里仅打印请求头实际登录校验时再从请求头获取登录凭证。校验逻辑完成后利用chain放行调用filter方法并传入exchange使下一个过滤器可使用上下文。 控制过滤器执行顺序 过滤器定义后要保证在netty routing filter之前执行因为其作用是做转发希望在转发前做登录校验所以优先级要更高。通过查看nt routing filter源码发现它实现了order接口来排序order接口要求实现get order方法返回int值值越小优先级越高netty routing filter默认优先级为integer最大值最低优先级。自定义过滤器实现order接口并设置较小优先级值如0即可在其之前执行 总结 自定义global filter方式写类实现接口实现filter方法利用ServerWebExchange exchange获取请求信息做登录校验校验完成利用过滤器链放行。控制过滤器执行顺序靠order接口实现get order方法返回int值值越小优先级越高NTROUTFILTER默认优先级最低自定义过滤器值比其小即可。掌握这些后登录校验可行。 自定义gateway filter概述 gateway filter特点使用时可自由指定作用范围能配置自定义参数比global filter更灵活但自定义较麻烦日常开发多选用global filter做登录校验功能时也常用global filter。 - 自定义方式需继承abstract gateway filter factory其作用是读取配置创建定制化过滤器对象采用工厂模式定义的是过滤器工厂。过滤器工厂内有apply方法基于配置创建过滤器对象采用匿名内部类实现filter方法编写逻辑。 - 过滤器工厂命名要求名字必须以gateway filter factory为后缀类名前缀将作为过滤器名字在配置文件中使用。 无参gateway filter的定义与实现 定义无参过滤器工厂类如print any gateway filter工厂类继承Abstract gateway filter factory泛型为object实现apply方法。注册工厂类给工厂类加Component注解注册为bean。构造过滤器在apply方法中用匿名内部类构造gateway filter实现filter方法可编写PRE或post逻辑此处仅打印执行信息。过滤器执行顺序问题全局过滤器和自定义过滤器执行顺序需控制匿名内部类无法实现order接口指定顺序解决办法一是单独写类实现gateway filter和order接口二是使用装饰模式。装饰模式实现定义OrderGatewayFilter类接受gateway filter和order参数实现GTFILTER和order接口构造函数记录参数filter方法调用委托对象的filter方法返回记录的order使用该装饰模式为自定义过滤器添加顺序。配置生效与测试在yml文件中配置过滤器可定义在某一路由下或default下作用于所有配置print any过滤器。重启服务清空日志浏览器访问后查看日志验证global filter先执行顺序为1print any gateway filter后执行顺序为0值越大优先级越低。 带参gateway filter的定义方式 定义属性类自定义带参gateway filter更复杂需定义专门属性类匹配参数一般定义在过滤器工厂内部为内部类变量数量与参数数量对应。 网关登录校验功能实现 准备工作及工具介绍 网关过滤器类型网关过滤器有gateway filter和global filter两种日常开发多用global filter本节课用它实现登录校验功能。黑马商城登录方式基于JWT实现相关密钥和工具类在单体架构项目hm service中需拷贝到网关项目。包括保存JWT密钥的加密文件hmall.jks、加载属性的JwtProperties类、生成密钥并注册到spring容器的SecurityConfig类、配置不需要登录校验路径的exclude paths、读取路径属性AuthProperties类以及生成和解析token的工具类JwtTool。 工具拷贝与配置 拷贝属性类将jw properties、OLI等属性类拷贝到网关项目新建的CONFIG包中标记为component使其生效。拷贝工具类拷贝工具类GDP t two到网关项目解决报错问题。拷贝密钥文件和配置文件将密钥文件HMGK和相关配置文件拷贝到网关项目。定义全局过滤器定义名为OsGlobalFilter的全局过滤器实现global filter和order接口设置order值为0在filter方法中编写登录校验逻辑包括获取request对象判断请求路径是否在放行路径中若在则放行不在则获取token并校验解析校验失败用401状态码拦截校验通过则传递用户信息本节课先打印用户id后续再实现传递。 校验token与拦截逻辑 获取token从request获取header通过指定请求头名字authorization获取token判断header不为空且不为null时取出token。校验token利用拷贝过来的工具类jp t two校验解析token校验失败时try catch捕获异常用401状态码拦截并设置response状态码为Unauthorized终止请求。传递用户信息校验通过则传递用户信息本节课先打印用户id。 路径校验与整体回顾 路径校验方法定义判断请求路径是否需要被拦截的方法通过注入all properties类获取放行路径利用spring提供的ant pass match匹配器判断请求路径与放行路径是否匹配循环遍历所有放行路径若匹配则返回true否则返回false。测试与回顾完成过滤器逻辑后配置购物车服务路由路径cars重启网关服务进行测试。未登录访问购物车路径返回401登录后可成功查询说明登录拦截生效。回顾网关登录校验逻辑主要包括获取请求和token、校验token、根据校验结果拦截或放行拦截时通过response设置状态码401并结束请求路径判断通过ant pass match匹配器判断配置路径与当前路径是否匹配。掌握这些API可实现整套登录拦截逻辑。 从网关到微服务的用户传递实现方法 实现思路 请求流程与用户信息传递方式请求先到网关网关过滤器中已实现登录校验并获取用户信息。网关到微服务是新的请求将用户信息保存到请求头是传递信息的最佳方案微服务可从请求头获取用户信息。微服务获取用户信息的优化微服务业务接口基于Spring MVC为避免在每个业务接口获取登录用户信息可在所有业务接口执行前通过Spring MVC拦截器获取请求头中的用户信息并保存到ThreadLocal后续业务可随时取用。 网关过滤器保存用户信息到请求头 利用API修改请求头网关提供了ServerWebExchange上下文对象其mutate方法可对下游请求进行改变和处理通过该方法返回的RequestBuilder可修改请求头信息。约定请求头名称与设置值请求头名称可自定义但需与微服务开发者约定好本案例约定为user info其值为用户IDlong型转字符串。完成请求头修改与传递修改完请求头后需调用build方法构建新的ServerWebExchange并将其传递到下一个过滤器以确保修改生效。测试用户信息传递在购物车服务的Controller中获取并打印请求头中的user info重启网关后通过查询购物车操作测试用户信息是否传递成功。 微服务编写拦截器获取用户信息 拦截器编写与功能实现 创建拦截器类在common模块的interceptor包下新建UserInfoInterceptor拦截器实现HandlerInterceptor接口只需实现preHandle和afterCompletion方法。获取并保存用户信息在preHandle方法中从Spring MVC的request对象获取请求头中的用户信息与网关约定的user info一致使用工具类判断不为空后通过common中的UserContext将用户信息字符串转long型存入ThreadLocal。清理用户信息在afterCompletion方法中调用UserContext的removeUser清理用户信息。 拦截器配置与生效问题解决 配置拦截器定义Spring MVC配置类MvcConfig实现WebMvcConfigure接口并加Configuration注解在addInterceptor方法中将UserInfoInterceptor添加到拦截器注册器默认拦截所有路径。解决配置类扫描问题由于配置类所在包与微服务包不同需在resource目录下的meta - info下的spring.factories文件中记录配置类名字使配置类生效。避免网关引用报错因网关引用了common且无Spring MVC会导致配置类在网关报错。通过给配置类加ConditionalOnClass注解以判断是否存在Spring MVC的核心API DispatcherServlet为条件使配置类仅在微服务生效。 测试拦截器生效重启网关和微服务如购物车服务测试拦截器是否生效如查询购物车时日志显示能从ThreadLocal获取到正确的用户ID而非写死的值。 总结回顾 网关传递用户信息网关通过过滤器获取用户信息利用exchange的API修改请求头将用户信息添加到请求头中传递给微服务。微服务获取用户信息微服务通过在common模块定义拦截器在所有业务接口执行前获取请求头中的用户信息并保存到ThreadLocal方便后续业务使用。问题解决与技术应用解决了拦截器配置生效问题包括配置类扫描和网关引用报错问题运用了Spring Boot自动装配原理。通过在spring.factories文件中记录配置类名字实现自动装配利用ConditionalOnClass注解根据项目中是否存在Spring MVC的核心API来控制配置类生效范围。这表明Spring Boot自动装配原理在实际开发中可解决诸多问题如本案例中的拦截器配置问题同时也为后续在微服务之间传递登录用户信息等操作奠定了基础。 微服务间用户信息传递问题引出 背景实现从网关到微服务的用户信息传递后复杂业务场景中微服务间相互调用时的用户信息传递面临挑战。场景示例以用户下单场景为例涉及交易服务、商品服务和购物车服务。前端请求先进入交易服务交易服务保存订单时需向商品服务扣减库存、向购物车服务清理购物车。 用户信息传递流程及问题分析 正常流程 前端带JWT token请求到网关网关过滤器校验token有效则解析用户信息存于请求头并转发给微服务。微服务通过通用拦截器从请求头获取用户信息如交易服务可拿到登录用户信息创建订单。 现有问题 交易服务调用购物车服务时未传用户id仅传商品id。购物车服务从user context获取用户id但因请求头无用户信息导致获取失败。原因是交易服务调用购物车服务未处理请求头而购物车服务获取用户方式依赖user context其前提是拦截器能从请求头取用户信息并存入user context当前交易服务调用购物车服务时请求头无用户信息。 OpenFeign拦截器解决方案 拦截器原理与作用OpenFeign的request interceptor接口其apply方法在每次请求时调用可利用request template修改请求头如添加请求头信息。拦截器定义与配置 定义位置因所有微服务调用其他服务时都需传递用户信息故定义在公共的HM-api模块最合适这样引用该模块的微服务在发起远程调用时拦截器自动生效。定义方式采用匿名内部类声明实现apply方法在方法内从user context获取用户信息需添加common依赖以使用user context判断用户id不为空后添加到请求头。生效条件配置类需加在Feign启动类上。 测试效果重启交易服务后下单测试查看购物车服务日志发现其执行业务时成功拿到user context中的用户信息购物车成功删除证明用户信息传递成功。 总结回顾微服务用户信息传递方案 过滤器和拦截器总结 网关的global filter过滤器进行JWT登录校验获取用户信息后保存到请求头转发给微服务。微服务的handler interceptor拦截器从请求头获取用户信息后保存到thread local方便微服务内部业务使用。OpenFeign的request interceptor拦截器在微服务间基于OpenFeign调用时将用户信息保存到请求头确保下游微服务能获取用户信息。 方案价值此方案是解决微服务体系登录功能的整体思路公司实现思路与之类似对实际开发具有重要参考价值。 文章转载自: http://www.morning.qmxsx.cn.gov.cn.qmxsx.cn http://www.morning.nhlnh.cn.gov.cn.nhlnh.cn http://www.morning.shyqcgw.cn.gov.cn.shyqcgw.cn http://www.morning.jyznn.cn.gov.cn.jyznn.cn http://www.morning.pznhn.cn.gov.cn.pznhn.cn http://www.morning.hlwzd.cn.gov.cn.hlwzd.cn http://www.morning.mrncd.cn.gov.cn.mrncd.cn http://www.morning.xqcbz.cn.gov.cn.xqcbz.cn http://www.morning.qineryuyin.com.gov.cn.qineryuyin.com http://www.morning.xfyjn.cn.gov.cn.xfyjn.cn http://www.morning.prhfc.cn.gov.cn.prhfc.cn http://www.morning.kyzja.com.gov.cn.kyzja.com http://www.morning.ljbch.cn.gov.cn.ljbch.cn http://www.morning.wkknm.cn.gov.cn.wkknm.cn http://www.morning.nwczt.cn.gov.cn.nwczt.cn http://www.morning.qkxt.cn.gov.cn.qkxt.cn http://www.morning.skql.cn.gov.cn.skql.cn http://www.morning.wxfgg.cn.gov.cn.wxfgg.cn http://www.morning.gqfjb.cn.gov.cn.gqfjb.cn http://www.morning.fnbtn.cn.gov.cn.fnbtn.cn http://www.morning.vjwkb.cn.gov.cn.vjwkb.cn http://www.morning.gqryh.cn.gov.cn.gqryh.cn http://www.morning.clbgy.cn.gov.cn.clbgy.cn http://www.morning.qcbhb.cn.gov.cn.qcbhb.cn http://www.morning.srmdr.cn.gov.cn.srmdr.cn http://www.morning.qwdqq.cn.gov.cn.qwdqq.cn http://www.morning.wffxr.cn.gov.cn.wffxr.cn http://www.morning.bpmns.cn.gov.cn.bpmns.cn http://www.morning.kztpn.cn.gov.cn.kztpn.cn http://www.morning.wwkft.cn.gov.cn.wwkft.cn http://www.morning.ntwxt.cn.gov.cn.ntwxt.cn http://www.morning.bpmdh.cn.gov.cn.bpmdh.cn http://www.morning.pnjsl.cn.gov.cn.pnjsl.cn http://www.morning.gczzm.cn.gov.cn.gczzm.cn http://www.morning.nsfxt.cn.gov.cn.nsfxt.cn http://www.morning.fqnql.cn.gov.cn.fqnql.cn http://www.morning.pjxlg.cn.gov.cn.pjxlg.cn http://www.morning.plqhb.cn.gov.cn.plqhb.cn http://www.morning.wklrz.cn.gov.cn.wklrz.cn http://www.morning.sblgt.cn.gov.cn.sblgt.cn http://www.morning.txmkx.cn.gov.cn.txmkx.cn http://www.morning.qynpw.cn.gov.cn.qynpw.cn http://www.morning.nmpdm.cn.gov.cn.nmpdm.cn http://www.morning.xlndf.cn.gov.cn.xlndf.cn http://www.morning.rxyz.cn.gov.cn.rxyz.cn http://www.morning.dbrpl.cn.gov.cn.dbrpl.cn http://www.morning.jkcnq.cn.gov.cn.jkcnq.cn http://www.morning.jynzb.cn.gov.cn.jynzb.cn http://www.morning.ckfqt.cn.gov.cn.ckfqt.cn http://www.morning.jzyfy.cn.gov.cn.jzyfy.cn http://www.morning.pmptm.cn.gov.cn.pmptm.cn http://www.morning.cxsdl.cn.gov.cn.cxsdl.cn http://www.morning.fjzlh.cn.gov.cn.fjzlh.cn http://www.morning.bqqzg.cn.gov.cn.bqqzg.cn http://www.morning.csdgt.cn.gov.cn.csdgt.cn http://www.morning.ymwrs.cn.gov.cn.ymwrs.cn http://www.morning.mqxzh.cn.gov.cn.mqxzh.cn http://www.morning.gbljq.cn.gov.cn.gbljq.cn http://www.morning.bbtn.cn.gov.cn.bbtn.cn http://www.morning.ddxjr.cn.gov.cn.ddxjr.cn http://www.morning.rzbgn.cn.gov.cn.rzbgn.cn http://www.morning.ypqwm.cn.gov.cn.ypqwm.cn http://www.morning.tkchg.cn.gov.cn.tkchg.cn http://www.morning.rwls.cn.gov.cn.rwls.cn http://www.morning.dgng.cn.gov.cn.dgng.cn http://www.morning.srhqm.cn.gov.cn.srhqm.cn http://www.morning.jhkzl.cn.gov.cn.jhkzl.cn http://www.morning.gqtzb.cn.gov.cn.gqtzb.cn http://www.morning.fcxt.cn.gov.cn.fcxt.cn http://www.morning.jqrhz.cn.gov.cn.jqrhz.cn http://www.morning.rpsjh.cn.gov.cn.rpsjh.cn http://www.morning.bxbnf.cn.gov.cn.bxbnf.cn http://www.morning.gglhj.cn.gov.cn.gglhj.cn http://www.morning.zztkt.cn.gov.cn.zztkt.cn http://www.morning.qczpf.cn.gov.cn.qczpf.cn http://www.morning.rpth.cn.gov.cn.rpth.cn http://www.morning.c7625.cn.gov.cn.c7625.cn http://www.morning.rpstb.cn.gov.cn.rpstb.cn http://www.morning.blqsr.cn.gov.cn.blqsr.cn http://www.morning.bpmft.cn.gov.cn.bpmft.cn 查看全文 http://www.tj-hxxt.cn/news/281529.html 相关文章: 网站制作器手机版下载北京建设制作网站 佳木斯万达建设网站包头做网站哪家好 怎么做自己的网站wordpress 栏目页 应用网站建设上海网站建设q.479185700棒 用html做家谱网站代码网网站开发和设计 成都必去景点排名上海seo招聘 外贸做网站用什么赣州市人才网 免费域名申请 tk关键词优化价格表 网络营销网站分析烟台做网站公司 开原网站开发无锡商之道网络科技有限公司 鞍山市建设工程安全生产监督管理站网站河北网站建站制作 泸州高端网站建设公司中华室内设计师 angular网站模板下载优惠做网站 手机咋做网站wordpress文章标题源码插件 花钱做网站注意些什么app定制开发网络公司 深圳专业做网站建网站价格wordpress 手机悬浮 石家庄建设一个网站多少钱wordpress网站搜不到 ppt模板免费网站在线制作宁陵做网站的公司 常州做网站找哪家好hcms wordpress 造作网站开发全网营销胡涛 上杭网站建设公司开发公司未售房产交的取暖费应走什么科目 单页的网站怎么做的wordpress 显示当前时间 绵阳最有实力的公司网站建设网站核检单 廊坊网站制作公司四川省城市建设培训中心 网站 吴川市建设工程公司网站sem和seo 帮人做海报的网站免费手游推广代理平台渠道 做软件推广网站怎么赚钱大学生商品网站建设 成都网站建设服务公司类似1688的采购平台有哪些 做公众号的网站有哪些功能做筹款的网站需要什么资质 iis7.5网站权限配置天津注册公司网站