当前位置: 首页 > news >正文

网站建设步骤详解视频来年做那些网站致富

网站建设步骤详解视频,来年做那些网站致富,哈尔滨网站建设排行,做分类信息网站文章目录 Sentinel微服务保护1.初识Sentinel1.1.雪崩问题及解决方案1.1.1.雪崩问题1.1.2.解决方案1.1.3.总结 1.2.服务保护技术对比1.3.Sentinel介绍和安装1.3.1.初识Sentinel1.3.2.安装Sentinel 1.4.微服务整合Sentinel 2.流量控制2.1.簇点链路2.1.快速入门2.2.流控模式2.2.1.… 文章目录 Sentinel微服务保护1.初识Sentinel1.1.雪崩问题及解决方案1.1.1.雪崩问题1.1.2.解决方案1.1.3.总结 1.2.服务保护技术对比1.3.Sentinel介绍和安装1.3.1.初识Sentinel1.3.2.安装Sentinel 1.4.微服务整合Sentinel 2.流量控制2.1.簇点链路2.1.快速入门2.2.流控模式2.2.1.关联模式2.2.2.链路模式2.2.3.总结 2.3.流控效果2.3.1.warm up2.3.2.排队等待2.3.3.总结 2.4.热点参数限流2.4.1.全局参数限流2.4.2.热点参数限流 3.隔离和降级3.1.FeignClient整合Sentinel3.1.1.修改配置开启sentinel功能3.1.2.编写失败降级逻辑3.1.3.总结 3.2.线程隔离舱壁模式3.2.1.线程隔离的实现方式3.2.2.sentinel的线程隔离3.2.3.总结 3.3.熔断降级3.3.1.慢调用3.3.2.异常比例、异常数 4.授权规则4.1.授权规则4.1.1.基本规则4.1.2.如何获取origin4.1.3.给网关添加请求头4.1.4.配置授权规则 4.2.自定义异常结果4.2.1.异常类型4.2.2.自定义异常处理 5.规则持久化5.1.规则管理模式5.1.1.pull模式5.1.2.push模式 Sentinel微服务保护 1.初识Sentinel 1.1.雪崩问题及解决方案 1.1.1.雪崩问题 微服务中服务间调用关系错综复杂一个微服务往往依赖于多个其它微服务。 如果服务提供者I发生了故障当前的应用的部分业务因为依赖于服务I因此也会被阻塞。此时其它不依赖于服务I的业务似乎不受影响。 但是依赖服务I的业务请求被阻塞用户不会得到响应则tomcat的这个线程不会释放于是越来越多的用户请求到来越来越多的线程会阻塞 服务器支持的线程和并发数有限请求一直阻塞会导致服务器资源耗尽从而导致所有其它服务都不可用那么当前服务也就不可用了。 那么依赖于当前服务的其它服务随着时间的推移最终也都会变的不可用形成级联失败雪崩就发生了 1.1.2.解决方案 解决雪崩问题的常见方式有四种 1超时处理设定超时时间请求超过一定时间没有响应就返回错误信息不会无休止等待 2仓壁模式 仓壁模式来源于船舱的设计船舱都会被隔板分离为多个独立空间当船体破损时只会导致部分空间进入将故障控制在一定范围内避免整个船体都被淹没。 于此类似我们可以限定每个业务能使用的线程数避免耗尽整个tomcat的资源因此也叫线程隔离。 3断路器由断路器统计业务执行的异常比例如果超出阈值则会熔断该业务拦截访问该业务的一切请求。 断路器会统计访问某个服务的请求数量异常比例当发现访问服务D的请求异常比例过高时认为服务D有导致雪崩的风险会拦截访问服务D的一切请求形成熔断 4流量控制限制业务访问的QPS避免服务因流量的突增而故障。限流 1.1.3.总结 什么是雪崩问题 微服务之间相互调用因为调用链中的一个服务故障引起整个链路都无法访问的情况。 可以认为 限流是对服务的保护避免因瞬间高并发流量而导致服务故障进而避免雪崩。是一种预防措施。 超时处理、线程隔离、降级熔断是在部分服务故障时将故障控制在一定范围避免雪崩。是一种补救措施。 1.2.服务保护技术对比 在SpringCloud当中支持多种服务保护技术 Netfix HystrixSentinelResilience4J 早期比较流行的是Hystrix框架但目前国内实用最广泛的还是阿里巴巴的Sentinel框架这里我们做下对比 SentinelHystrix隔离策略信号量隔离线程池隔离/信号量隔离熔断降级策略基于慢调用比例或异常比例基于失败比率实时指标实现滑动窗口滑动窗口基于 RxJava规则配置支持多种数据源支持多种数据源扩展性多个扩展点插件的形式基于注解的支持支持支持限流基于 QPS支持基于调用关系的限流有限的支持流量整形支持慢启动、匀速排队模式不支持系统自适应保护支持不支持控制台开箱即用可配置规则、查看秒级监控、机器发现等不完善常见框架的适配Servlet、Spring Cloud、Dubbo、gRPC 等Servlet、Spring Cloud Netflix 1.3.Sentinel介绍和安装 1.3.1.初识Sentinel Sentinel是阿里巴巴开源的一款微服务流量控制组件。官网地址https://sentinelguard.io/zh-cn/index.html Sentinel 具有以下特征: •丰富的应用场景Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景例如秒杀即突发流量控制在系统容量可以承受的范围、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。 •完备的实时监控Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据甚至 500 台以下规模的集群的汇总运行情况。 •广泛的开源生态Sentinel 提供开箱即用的与其它开源框架/库的整合模块例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。 •完善的 SPI 扩展点Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。 1.3.2.安装Sentinel 1下载 sentinel官方提供了UI控制台方便我们对系统做限流设置。可以在GitHub下载。 2运行 将jar包放到任意非中文目录执行命令 java -jar sentinel-dashboard-1.8.1.jar如果要修改Sentinel的默认端口、账户、密码可以通过下列配置 配置项默认值说明server.port8080服务端口sentinel.dashboard.auth.usernamesentinel默认用户名sentinel.dashboard.auth.passwordsentinel默认密码 例如修改端口 java -Dserver.port8090 -jar sentinel-dashboard-1.8.1.jar3访问 访问http://localhost:8080页面就可以看到sentinel的控制台了 需要输入账号和密码默认都是sentinel 登录后发现一片空白什么都没有这是因为我们还没有与微服务整合。 1.4.微服务整合Sentinel 我们在service中整合sentinel并连接sentinel的控制台步骤如下 1引入sentinel依赖 !--sentinel-- dependencygroupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-sentinel/artifactId /dependency2配置控制台 修改application.yaml文件添加下面内容 server:port: 8088 spring:cloud: sentinel:transport:dashboard: localhost:80803访问service的任意端点 打开浏览器访问服务这样才能触发sentinel的监控。 然后再访问sentinel的控制台查看效果 2.流量控制 雪崩问题虽然有四种方案但是限流是避免服务因突发的流量而发生故障是对微服务雪崩问题的预防。 2.1.簇点链路 当请求进入微服务时首先会访问DispatcherServlet然后进入Controller、Service、Mapper这样的一个调用链就叫做簇点链路。簇点链路中被监控的每一个接口就是一个资源。 默认情况下sentinel会监控SpringMVC的每一个端点Endpoint也就是controller中的方法因此SpringMVC的每一个端点Endpoint就是调用链路中的一个资源。 流控、熔断等都是针对簇点链路中的资源来设置的因此我们可以点击对应资源后面的按钮来设置规则 流控流量控制降级降级熔断热点热点参数限流是限流的一种授权请求的权限控制 2.1.快速入门 点击资源后面的流控按钮就可以弹出表单。 表单中可以填写限流规则如下 其含义是限制 /order/{orderId}这个资源的单机QPS为1即每秒只允许1次请求超出的请求会被拦截并报错。 2.2.流控模式 在添加限流规则时点击高级选项可以选择三种流控模式 直接统计当前资源的请求触发阈值时对当前资源直接限流也是默认的模式关联统计与当前资源相关的另一个资源触发阈值时对当前资源限流链路统计从指定链路访问到本资源的请求触发阈值时对指定链路限流 2.2.1.关联模式 关联模式统计与当前资源相关的另一个资源触发阈值时对当前资源限流 配置规则 语法说明当/write资源访问量触发阈值时就会对/read资源限流避免影响/write资源。 使用场景比如用户支付时需要修改订单状态同时用户要查询订单。查询和修改操作会争抢数据库锁产生竞争。业务需求是优先支付和更新订单的业务因此当修改订单业务触发阈值时需要对查询订单业务限流。 2.2.2.链路模式 链路模式只针对从指定链路访问到本资源的请求做统计判断是否超过阈值。 配置示例 例如有两条请求链路 /test1 -- /common /test2 -- /common 如果只希望统计从/test2进入到/common的请求则可以这样配置 2.2.3.总结 流控模式有哪些 •直接对当前资源限流 •关联高优先级资源触发阈值对低优先级资源限流。 •链路阈值统计时只统计从指定资源进入当前资源的请求是对请求来源的限流 2.3.流控效果 流控效果是指请求达到流控阈值时应该采取的措施包括三种 快速失败达到阈值后新的请求会被立即拒绝并抛出FlowException异常。是默认的处理方式。 warm up预热模式对超出阈值的请求同样是拒绝并抛出异常。但这种模式阈值会动态变化从一个较小值逐渐增加到最大阈值。 排队等待让所有的请求按照先后次序排队执行两个请求的间隔不能小于指定时长 2.3.1.warm up 阈值一般是一个微服务能承担的最大QPS但是一个服务刚刚启动时一切资源尚未初始化冷启动如果直接将QPS跑到最大值可能导致服务瞬间宕机。 warm up也叫预热模式是应对服务冷启动的一种方案。请求阈值初始值是 maxThreshold / coldFactor持续指定时长后逐渐提高到maxThreshold值。而coldFactor的默认值是3. 例如我设置QPS的maxThreshold为10预热时间为5秒那么初始阈值就是 10 / 3 也就是3然后在5秒后逐渐增长到10. 2.3.2.排队等待 当请求超过QPS阈值时快速失败和warm up 会拒绝新的请求并抛出异常。 而排队等待则是让所有请求进入一个队列中然后按照阈值允许的时间间隔依次执行。后来的请求必须等待前面执行完成如果请求预期的等待时间超出最大时长则会被拒绝。 工作原理 例如QPS 5意味着每200ms处理一个队列中的请求timeout 2000意味着预期等待时长超过2000ms的请求会被拒绝并抛出异常。 那什么叫做预期等待时长呢 比如现在一下子来了12 个请求因为每200ms执行一个请求那么 第6个请求的预期等待时长 200 * 6 - 1 1000ms第12个请求的预期等待时长 200 * 12-1 2200ms 现在第1秒同时接收到10个请求但第2秒只有1个请求此时QPS的曲线这样的 如果使用队列模式做流控所有进入的请求都要排队以固定的200ms的间隔执行QPS会变的很平滑 平滑的QPS曲线对于服务器来说是更友好的。 2.3.3.总结 流控效果有哪些 快速失败QPS超过阈值时拒绝新的请求 warm up QPS超过阈值时拒绝新的请求QPS阈值是逐渐提升的可以避免冷启动时高并发导致服务宕机。 排队等待请求会进入队列按照阈值允许的时间间隔依次执行请求如果请求预期等待时长大于超时时间直接拒绝 2.4.热点参数限流 之前的限流是统计访问某个资源的所有请求判断是否超过QPS阈值。而热点参数限流是分别统计参数值相同的请求判断是否超过QPS阈值。 2.4.1.全局参数限流 例如一个根据id查询商品的接口 访问/goods/{id}的请求中id参数值会有变化热点参数限流会根据参数值分别统计QPS统计结果 当id1的请求触发阈值被限流时id值不为1的请求不受影响。 配置示例 代表的含义是对hot这个资源的0号参数第一个参数做统计每1秒相同参数值的请求数不能超过5 2.4.2.热点参数限流 刚才的配置中对查询商品这个接口的所有商品一视同仁QPS都限定为5. 而在实际开发中可能部分商品是热点商品例如秒杀商品我们希望这部分商品的QPS限制与其它商品不一样高一些。那就需要配置热点参数限流的高级选项了 结合上一个配置这里的含义是对0号的long类型参数限流每1秒相同参数的QPS不能超过5有两个例外 •如果参数值是100则每1秒允许的QPS为10 •如果参数值是101则每1秒允许的QPS为15 3.隔离和降级 限流是一种预防措施虽然限流可以尽量避免因高并发而引起的服务故障但服务还会因为其它原因而故障。 而要将这些故障控制在一定范围避免雪崩就要靠线程隔离舱壁模式和熔断降级手段了。 线程隔离调用者在调用服务提供者时给每个调用的请求分配独立线程池出现故障时最多消耗这个线程池内资源避免把调用者的所有资源耗尽。 熔断降级是在调用方这边加入断路器统计对服务提供者的调用如果调用的失败比例过高则熔断该业务不允许访问该服务的提供者了。 不管是线程隔离还是熔断降级都是对客户端调用方的保护。需要在调用方 发起远程调用时做线程隔离、或者服务熔断。 而我们的微服务远程调用都是基于Feign来完成的因此我们需要将Feign与Sentinel整合在Feign里面实现线程隔离和服务熔断。 3.1.FeignClient整合Sentinel SpringCloud中微服务调用都是通过Feign来实现的因此做客户端保护必须整合Feign和Sentinel。 3.1.1.修改配置开启sentinel功能 修改Service的application.yml文件开启Feign的Sentinel功能 feign:sentinel:enabled: true # 开启feign对sentinel的支持3.1.2.编写失败降级逻辑 业务失败后不能直接报错而应该返回用户一个友好提示或者默认结果这个就是失败降级逻辑。 给FeignClient编写失败后的降级逻辑 ①方式一FallbackClass无法对远程调用的异常做处理 ②方式二FallbackFactory可以对远程调用的异常做处理我们选择这种 这里我们演示方式二的失败降级处理。 步骤一在feing-api项目中定义类实现FallbackFactory 代码 package cn.itcast.feign.clients.fallback;import cn.itcast.feign.clients.UserClient; import cn.itcast.feign.pojo.User; import feign.hystrix.FallbackFactory; import lombok.extern.slf4j.Slf4j;Slf4j public class UserClientFallbackFactory implements FallbackFactoryUserClient {Overridepublic UserClient create(Throwable throwable) {return new UserClient() {Overridepublic User findById(Long id) {log.error(查询用户异常, throwable);return new User();}};} } 步骤二在feing-api项目中的DefaultFeignConfiguration类中将UserClientFallbackFactory注册为一个Bean Bean public UserClientFallbackFactory userClientFallbackFactory(){return new UserClientFallbackFactory(); }步骤三在feing-api项目中的UserClient接口中使用UserClientFallbackFactory import cn.itcast.feign.clients.fallback.UserClientFallbackFactory; import cn.itcast.feign.pojo.User; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable;FeignClient(value userservice, fallbackFactory UserClientFallbackFactory.class) public interface UserClient {GetMapping(/user/{id})User findById(PathVariable(id) Long id); }重启后访问一次订单查询业务然后查看sentinel控制台可以看到新的簇点链路 3.1.3.总结 Sentinel支持的雪崩解决方案 线程隔离仓壁模式降级熔断 Feign整合Sentinel的步骤 在application.yml中配置feign.sentienl.enabletrue给FeignClient编写FallbackFactory并注册为Bean将FallbackFactory配置到FeignClient 3.2.线程隔离舱壁模式 3.2.1.线程隔离的实现方式 线程隔离有两种方式实现 线程池隔离 信号量隔离Sentinel默认采用 如图 线程池隔离给每个服务调用业务分配一个线程池利用线程池本身实现隔离效果 信号量隔离不创建线程池而是计数器模式记录业务使用的线程数量达到信号量上限时禁止新的请求。 两者的优缺点 3.2.2.sentinel的线程隔离 用法说明 在添加限流规则时可以选择两种阈值类型 QPS就是每秒的请求数 线程数是该资源能使用用的tomcat线程数的最大值。也就是通过限制线程数量实现线程隔离舱壁模式。 3.2.3.总结 线程隔离的两种手段是 信号量隔离 线程池隔离 信号量隔离的特点是 基于计数器模式简单开销小 线程池隔离的特点是 基于线程池模式有额外开销但隔离控制更强 3.3.熔断降级 熔断降级是解决雪崩问题的重要手段。其思路是由断路器统计服务调用的异常比例、慢请求比例如果超出阈值则会熔断该服务。即拦截访问该服务的一切请求而当服务恢复时断路器会放行访问该服务的请求。 断路器控制熔断和放行是通过状态机来完成的 状态机包括三个状态 closed关闭状态断路器放行所有请求并开始统计异常比例、慢请求比例。超过阈值则切换到open状态open打开状态服务调用被熔断访问被熔断服务的请求会被拒绝快速失败直接走降级逻辑。Open状态5秒后会进入half-open状态half-open半开状态放行一次请求根据执行结果来判断接下来的操作。 请求成功则切换到closed状态请求失败则切换到open状态 断路器熔断策略有三种慢调用、异常比例、异常数 3.3.1.慢调用 慢调用业务的响应时长RT大于指定时长的请求认定为慢调用请求。在指定时间内如果请求数量超过设定的最小数量慢调用比例大于设定的阈值则触发熔断。 例如 解读RT超过500ms的调用是慢调用统计最近10000ms内的请求如果请求量超过10次并且慢调用比例不低于0.5则触发熔断熔断时长为5秒。然后进入half-open状态放行一次请求做测试。 3.3.2.异常比例、异常数 异常比例或异常数统计指定时间内的调用如果调用次数超过指定请求数并且出现异常的比例达到设定的比例阈值或超过指定异常数则触发熔断。 例如一个异常比例设置 解读统计最近1000ms内的请求如果请求量超过10次并且异常比例不低于0.4则触发熔断。 一个异常数设置 解读统计最近1000ms内的请求如果请求量超过10次并且异常比例不低于2次则触发熔断。 4.授权规则 授权规则可以对请求方来源做判断和控制。 4.1.授权规则 4.1.1.基本规则 授权规则可以对调用方的来源做控制有白名单和黑名单两种方式。 白名单来源origin在白名单内的调用者允许访问 黑名单来源origin在黑名单内的调用者不允许访问 点击左侧菜单的授权可以看到授权规则 资源名就是受保护的资源例如/order/{orderId} 流控应用是来源者的名单 如果是勾选白名单则名单中的来源被许可访问。如果是勾选黑名单则名单中的来源被禁止访问。 比如我们允许请求从gateway到order-service不允许浏览器访问order-service那么白名单中就要填写网关的来源名称origin。 4.1.2.如何获取origin Sentinel是通过RequestOriginParser这个接口的parseOrigin来获取请求的来源的。 public interface RequestOriginParser {/*** 从请求request对象中获取origin获取方式自定义*/String parseOrigin(HttpServletRequest request); }这个方法的作用就是从request对象中获取请求者的origin值并返回。 默认情况下sentinel不管请求者从哪里来返回值永远是default也就是说一切请求的来源都被认为是一样的值default。 因此我们需要自定义这个接口的实现让不同的请求返回不同的origin。 例如order-service服务中我们定义一个RequestOriginParser的实现类 package cn.itcast.order.sentinel;import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.RequestOriginParser; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils;import javax.servlet.http.HttpServletRequest;Component public class HeaderOriginParser implements RequestOriginParser {Overridepublic String parseOrigin(HttpServletRequest request) {// 1.获取请求头String origin request.getHeader(origin);// 2.非空判断if (StringUtils.isEmpty(origin)) {origin blank;}return origin;} }我们会尝试从request-header中获取origin值。 4.1.3.给网关添加请求头 既然获取请求origin的方式是从reques-header中获取origin值我们必须让所有从gateway路由到微服务的请求都带上origin头。 这个需要利用之前学习的一个GatewayFilter来实现AddRequestHeaderGatewayFilter。 修改gateway服务中的application.yml添加一个defaultFilter spring:cloud:gateway:default-filters:- AddRequestHeaderorigin,gatewayroutes:# ...略这样从gateway路由的所有请求都会带上origin头值为gateway。而从其它地方到达微服务的请求则没有这个头。 4.1.4.配置授权规则 接下来我们添加一个授权规则放行origin值为gateway的请求。 配置如下 现在我们直接跳过网关访问order-service服务 通过网关访问 4.2.自定义异常结果 默认情况下发生限流、降级、授权拦截时都会抛出异常到调用方。异常结果都是flow limmiting限流。这样不够友好无法得知是限流还是降级还是授权拦截。 4.2.1.异常类型 而如果要自定义异常时的返回结果需要实现BlockExceptionHandler接口 public interface BlockExceptionHandler {/*** 处理请求被限流、降级、授权拦截时抛出的异常BlockException*/void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception; }这个方法有三个参数 HttpServletRequest requestrequest对象HttpServletResponse responseresponse对象BlockException e被sentinel拦截时抛出的异常 这里的BlockException包含多个不同的子类 异常说明FlowException限流异常ParamFlowException热点参数限流的异常DegradeException降级异常AuthorityException授权规则异常SystemBlockException系统规则异常 4.2.2.自定义异常处理 下面我们就在order-service定义一个自定义异常处理类 package cn.itcast.order.sentinel;import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler; import com.alibaba.csp.sentinel.slots.block.BlockException; import com.alibaba.csp.sentinel.slots.block.authority.AuthorityException; import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException; import com.alibaba.csp.sentinel.slots.block.flow.FlowException; import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowException; import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;Component public class SentinelExceptionHandler implements BlockExceptionHandler {Overridepublic void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {String msg 未知异常;int status 429;if (e instanceof FlowException) {msg 请求被限流了;} else if (e instanceof ParamFlowException) {msg 请求被热点参数限流;} else if (e instanceof DegradeException) {msg 请求被降级了;} else if (e instanceof AuthorityException) {msg 没有权限访问;status 401;}response.setContentType(application/json;charsetutf-8);response.setStatus(status);response.getWriter().println({\msg\: msg , \status\: status });} }重启测试在不同场景下会返回不同的异常消息. 5.规则持久化 现在sentinel的所有规则都是内存存储重启后所有规则都会丢失。在生产环境下我们必须确保这些规则的持久化避免丢失。 5.1.规则管理模式 规则是否能持久化取决于规则管理模式sentinel支持三种规则管理模式 原始模式Sentinel的默认模式将规则保存在内存重启服务会丢失。pull模式push模式 5.1.1.pull模式 pull模式控制台将配置的规则推送到Sentinel客户端而客户端会将配置规则保存在本地文件或数据库中。以后会定时去本地文件或数据库中查询更新本地规则。 5.1.2.push模式 push模式控制台将配置规则推送到远程配置中心例如Nacos。Sentinel客户端监听Nacos获取配置变更的推送消息完成本地配置更新。
http://www.pierceye.com/news/583548/

相关文章:

  • 做网站找我二级学院网站建设方案
  • 知名网站建设公司 北京近期网络营销的热点事件
  • 网站开发产品经理网站例子
  • 动态静态结合网站网站做404是什么意思
  • 注册域名的网站网站建设的具体步骤
  • 行业网站分类自建站排名
  • 网站备案 登陆安徽省住房和城乡建设厅网站领域
  • 做个网站需要多少钱.网站建设合同注意事项
  • 中国诚信建设网站在线代码生成器
  • 长沙企业网站建设团队目前网络最好的挣钱平台
  • 国家建设工程安全质量监督网站友情链接网
  • 适合html初学者做的网站中卫网站推广软件
  • 一个vps主机放两个网站 速度怎么做发卡网站
  • 海米云网站建设网站开发 去哪里找页面
  • 天津做网站优化的公司新手学做网站优化
  • 万网怎么上传网站wordpress google字体 360
  • 为什么建设的网站有时候访问慢6紫金优化网站制作
  • 如何在公司系统建网站广州短视频seo哪家好
  • 电气网站开发福安网站定制
  • 推荐一下做图文的网站html简单的个人网页代码
  • 网页新建站点网站建设缺陷
  • 移动端网站推广怎么申请pc网站域名
  • 外国男男做暧暧视频网站二级建造师考试试题
  • 普通网站建设是什么wordpress主题显示不
  • 朔州网站建设全球速卖通是什么平台
  • wordpress外贸网站好用的模板下载网站开发就业趋势
  • 长春模板建站代理网站开发嘉比格网络
  • 网站建设预算企业网站的公司和产品信息的介绍与网络营销关系
  • 网站开发的学习电子商务网站建设公
  • 网站的功能需求分析c语言网页编辑器