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

深圳网站设计推荐柚米北京汉邦未来网站建设有限公司

深圳网站设计推荐柚米,北京汉邦未来网站建设有限公司,怎样免费网站建设,电脑有了外网是不是就可以做网站Nacos介绍 Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的⾸字⺟简称#xff0c;⼀个更易于构 建云原⽣应⽤的动态服务发现、配置管理和服务管理平台。 在这个介绍中#xff0c;可以看出Nacos⾄少有三个核⼼功能#xff1a; 1. 动态服务发现 2. 配…Nacos介绍 Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的⾸字⺟简称⼀个更易于构 建云原⽣应⽤的动态服务发现、配置管理和服务管理平台。 在这个介绍中可以看出Nacos⾄少有三个核⼼功能 1. 动态服务发现 2. 配置管理 3. 服务管理 后续会分别来介绍这三个功能是怎么回事。 下载和解压 教程制作时Nacos的最新发⾏版为 2 . 1 . 1 (Aug 8 th, 2022 ) 本教程就是基于这个版本官⽅ 当前推荐的稳定版本为2 . 0 . 3 。 查看最新Nacos发⾏版 https://github.com/alibaba/nacos/releases 并且可以在此⽹⻚上下载安装包 下载完了之后进⾏解压解压之后的⽬录为   1. bin⽬录下是启动和停⽌的脚本 2. conf⽬录下是Nacos的配置⽂件 3. target⽬录下是Nacos的jar包启动脚本中其实就是运⾏的这个jar包停⽌脚步中是直接kill到进 程 启动 解压完之后就可以启动Nacos了Nacos⽀持单机和集群默认是以集群模式启动通过添加 -m standalone就会以单机模式启动。 Linux/Unix/Mac 启动命令(standalone代表着单机模式运⾏⾮集群模式): sh startup.sh -m standalone 如果您使⽤的是ubuntu系统或者运⾏脚本报错提示[[符号找不到可尝试如下运⾏ bash startup.sh -m standalone Windows 启动命令(standalone代表着单机模式运⾏⾮集群模式): startup.cmd -m standalone 启动⽇志 可以发现默认情况下Nacos占⽤了 8848 端⼝。 我们可以访问 http://localhost: 8848 /nacos 来访问Nacos 默认的⽤户名和密码为nacos/nacos 登录进来后 这个⽹⻚相当于nacos的管理台有 1. 配置管理 2. 服务管理 3. 权限控制 4. 命名空间 5. 集群管理 配置管理 配置其实就是⼀个keyvalue⽐如 spring . datasource . username zhouyu spring . datasource . password 123456 并且我们通常会把这些配置写在application.properties或application.yml⽂件中当时通过这种⽅式⼀定配置发⽣了改变就需要重启应⽤并且通过这种⽅式配置的配置项仅限于当前应⽤⽽不能做到多个应⽤共享。 那么nacos的配置管理功能就是来解决这些问题的我们可以直接通过nacos管理台来新增配置并且这些配置能够被多个应⽤给使⽤到。 新建配置 新建配置时可以指定 1. Data ID相当于⼀个配置⽂件⽐如相当于application.properties或者application dev.properties不过要注意的是我们在某个项⽬中使⽤application.properties⽂件中那个 application表示的就是当前应⽤那我们在nacos进⾏配置时就要尽可能的取⼀些有含义的Data ID⽐如user.properties表示⽤户应⽤的配置order.properties表示订单应⽤的配置 common.properties表示多个应⽤共享的配置。 2. Group在nacos中⼀个Data ID也就是⼀个或多个配置⽂件可以归类到同⼀个Group中Group的作⽤就是⽤来区分Data ID相同的情况不同的应⽤或中间件使⽤了相同的Data ID时就可以通过Group来进⾏区分默认为DEFAULT_GROUP 3. 配置内容写具体的配置项可以⽤properties的格式也可以⽤yaml的格式 ⽐如   拉取配置 在nacos中新建完配置后那作为⼀个SpringBoot应⽤我们如何来获取配置呢 Java SDK ⾸先我们可以直接使⽤Nacos提供的Java SDK来获取配置。 ⾸先在项⽬中添加如下依赖 dependency groupIdcom.alibaba.nacos/groupId artifactIdnacos-client/artifactId version2.1.1/version /dependency 然后可以使⽤如下代码来获取nacos中的配置 try { String serverAddr localhost:8848; String dataId user.properties; String group DEFAULT_GROUP; Properties properties new Properties(); properties.put(serverAddr, serverAddr); ConfigService configService NacosFactory.createConfigService(propert ies); String content configService.getConfig(dataId, group, 5000); System.out.println(content); } catch (NacosException e) { // TODO Auto-generated catch block e.printStackTrace(); } 1. serverAddrnacos的地址 2. dataId想要获取的配置⽂件的名字 3. group分组 在Java SDK中除开有获取配置的API同时也提供了新增、删除、监听配置的API。 我们可以通过如下代码来监听配置的变化 try { String serverAddr localhost:8848; String dataId user.properties; String group DEFAULT_GROUP; Properties properties new Properties(); properties.put(serverAddr, serverAddr); ConfigService configService NacosFactory.createConfigService(propert ies); String content configService.getConfig(dataId, group, 5000); System.out.println(content); configService.addListener(dataId, group, new Listener() { public void receiveConfigInfo(String configInfo) { System.out.println(recieve1: configInfo); } public Executor getExecutor() { return null; } }); // 测试让主线程不退出因为订阅配置是守护线程主线程退出守护线程就会退出。 正式代 //码中⽆需下⾯代码 while (true) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } catch (NacosException e) { // TODO Auto-generated catch block e.printStackTrace(); } 剩余API⼤家可以直接参考官⽹ https://nacos.io/zh-cn/docs/sdk.html Spring 在真正开发时我们不太会通过Java SDK的⽅式来拉取nacos中的配置那Nacos有没有针对Spring提供⼀些⽐较好⽤的注解或API呢 当然是有的。 增加⼀下依赖不再需要nacos-client依赖了 dependencygroupIdcom.alibaba.nacos/groupIdartifactIdnacos-spring-context/artifactIdversion1.1.1/version /dependency 我们可以按以下⽅式来配置Spring容器 Configuration EnableNacosConfig(globalProperties NacosProperties(serverAddr 127.0. 0.1:8848)) NacosPropertySource(dataId user.properties, autoRefreshed true) ComponentScan(com.zhouyu) public class AppConfig { } 很明显通过EnableNacosConfig注解定义了nacos的地址通过NacosPropertySource表示想要拉取的dataId并且设置⾃动刷新也就是配置发⽣了改变则会⾃动⽣效。 那如何使⽤某⼀个具体的配置项呢 Component public class UserService {NacosValue(${spring.datasource.username})private String username;public void test(){System.out.println(username);} } 可以通过NacosValue来使⽤某⼀具体的配置项那Value⾏不⾏呢也是可以的。 之所以可以原因是EnableNacosConfig注解会负责把指定的dataId的配置项拉取到应⽤并封装为PropertySource对象添加到Environment对象中所以Value也能读取到相应的配置项。 SpringBoot 如果我们使⽤SpringBoot那则可以⽐Spring更加简单。 ⾸先引⼊依赖 dependencygroupIdcom.alibaba.boot/groupIdartifactIdnacos-config-spring-boot-starter/artifactIdversion0.2.12/version /dependency 然后在application.properties中配置nacos的地址 nacos.config.server-addr127.0.0.1:8848 然后 SpringBootApplication NacosPropertySource(dataId user.properties, autoRefreshed true) public class UserApplication {public static void main(String[] args) {ConfigurableApplicationContext applicationContext SpringApplicat ion.run(UserApplication.class, args);UserService userService applicationContext.getBean(UserService.c lass);userService.test();} } 依旧使⽤NacosPropertySource来指定要拉取的配置dataId即可就可以使⽤Value或NacosValue来获取某个具体的配置项了。 那有同学可能会想到我们可不可以直接在application.properties⽂件中来配置dataid呢确实可以 nacos.config.server-addr 127.0.0.1:8848 nacos.config.data-id user.properties nacos.config.bootstrap.enable true 不过要注意⼀定得把nacos.config.bootstrap.enable设置为true不然是不⾏的。 SpringCloud 如果我们是⽤SpringCloud那将⽐SpringBoot更加简单。 引⼊依赖 dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-config/artifactId version2.2.8.RELEASE/version /dependency 然后在boostrap.properties⽂件中配置 spring.application.name user spring.cloud.nacos.server-addr 127.0.0.1:8848 就可以了因为会⾃动去连接nacos并获取dataid为user.properties的配置了。 到这⾥我们⼤概知道了Nacos的配置管理是怎么⽤的了接下来我们再来介绍⼀些配置管理更⾼级的功能。 按profile拉取配置 在使⽤spring-cloud-starter-alibaba-nacos-config时我们除开可以配置 spring.cloud.nacos.config.server-addr外还可以配置 1. spring.cloud.nacos.config.group默认为DEFAULT_GROUP 2. spring.cloud.nacos.config.file-extension默认为properties 3. spring.cloud.nacos.config.prefix默认为${spring.application.name} 所以默认情况下会拉取DEFAULT_GROUP组下dataid为user.properties的配置不过通过看源码 // com.alibaba.cloud.nacos.client.NacosPropertySourceLocator#loadApplicati onConfiguration private void loadApplicationConfiguration( CompositePropertySource compositePropertySource, String dataIdPrefix, NacosConfigProperties properties, Environment environment) { String fileExtension properties.getFileExtension(); String nacosGroup properties.getGroup(); // 1 // load directly once by default loadNacosDataIfPresent(compositePropertySource, dataIdPrefix, nacosGro up,fileExtension, true); // 2 // load with suffix, which have a higher priority than the default loadNacosDataIfPresent(compositePropertySource,dataIdPrefix DOT fileExtension, nacosGroup, fileExtension, true); // 3 // Loaded with profile, which have a higher priority than the suffix for (String profile : environment.getActiveProfiles()) { String dataId dataIdPrefix SEP1 profile DOT fileExtensio n; loadNacosDataIfPresent(compositePropertySource, dataId, nacosGroup ,fileExtension, true); } } 可以发现在拉取配置时会分为三步 1. 拉取dataid为user的配置 2. 拉取dataid为user.properties的配置 3. 拉取dataid为user-${ spring.profiles.active }.properties的配置 并且优先级依次增⾼。 还值得注意的是在拉取配置时还会加上namespace这个维度取获取配置可以通过 spring.cloud.nacos.config.namespace进⾏配置。 我们可以在Nacos管理台 1. 新建不同的namespace 2. 在每个namespace下可以进⾏dataid名称相同的配置 3. 每个dataid⼜可以分配到不同的group下 相当于⼀个三层结构   拉取多个配置 ⼀个应⽤可能不⽌需要⼀个配置有时可能需要拉取多个配置此时可以利⽤ 1. spring.cloud.nacos.config.extension-configs[ 0 ]. data-id datasource.properties 2. spring.cloud.nacos.config.shared-configs[ 0 ]. data-id common.properties extension-configs表示拉取额外的配置⽂件shared-configs也表示拉取额外的配置⽂件只不过 1. extension-configs表示本应⽤特有的 2. shared-configs表示多个应⽤共享的 注意优先级 ● extension-configs[ 2 ] extension-configs[ 1 ] extension-configs[ 0 ● shared-configs[ 2 ] shared-configs[ 1 ] shared-configs[ 0 ] ● 主配置 extension-configs shared-configs 配置的⾃动刷新 默认情况下主配置会⾃动刷新extension-configs和shared-configs不会⾃动刷新 可以通过 spring.cloud.nacos.config.refresh-enabledfalse来关闭主配置的⾃动刷新。 ⾃动配置的意思是⼀旦应⽤中引⼊的配置发⽣了变化应⽤端也能及时获取到最新值。 值得注意的是尽管默认情况下会⾃动刷新但是对于通过Value的使⽤⽅式还需要在该Bean上加上 RefreshScope注解这样才能动态的修改Value属性达到动态更新的最终效果。 历史版本回滚 可以回滚某个配置到历史版本 监听查询 监听某个配置哪些应⽤在使⽤ 服务管理 服务管理核⼼就是 1. 服务注册 2. 服务发现 通过nacos的服务注册与发现可以使得在调⽤微服务时可以更加简单。 Java SDK 服务注册 ⾸先我们可以直接使⽤Nacos提供的Java SDK来进⾏服务注册。 ⾸先在项⽬中添加如下依赖 dependency groupIdcom.alibaba.nacos/groupId artifactIdnacos-client/artifactId version2.1.1/version /dependency 我们可以使⽤如下代码来快速的进⾏服务注册 NamingService naming NamingFactory.createNamingService(localhost:8848); naming.registerInstance(app1, 11.11.11.11, 8888); 以上代码表示注册⼀个服务 1. 服务名字为app 1 2. 访问该服务的地址为 11 . 11 . 11 . 11 8888 注意执⾏完上述代码后不要上线程停掉可以加上 System.in.read(); 运⾏为代码后就可以到Nacos管理台看到 可以发现⼀个服务下 1. ⼀个服务可以属于某⼀个组可以在注册时指定group 2. ⼀个服务下可以有多个实例 3. ⼀个服务下多个实例可以分为多个虚拟集群 ⽐如以下代码就注册了⼀个服务有三个实例分别属于两个虚拟集群 NamingService naming NamingFactory.createNamingService(localhost:8848) ; naming.registerInstance(app1, 11.11.11.11, 8888, cluster1); NamingService naming1 NamingFactory.createNamingService(localhost:8848 ); naming1.registerInstance(app1, 11.11.11.12, 8888, cluster1); NamingService naming2 NamingFactory.createNamingService(localhost:8848 ); naming2.registerInstance(app1, 11.11.11.13, 8888, cluster2); System.in.read(); 对应的管理台展示为 详情如下 我们也可以使⽤更加定制化的⽅式来注册服务 NamingService naming NamingFactory.createNamingService(localhost:8848) ; Instance instance new Instance(); instance.setIp(55.55.55.55); instance.setPort(9999); instance.setHealthy(false); instance.setWeight(2.0); MapString, String instanceMeta new HashMapString, String(); instanceMeta.put(site, et2); instance.setMetadata(instanceMeta); naming.registerInstance(app1, instance); System.in.read(); 以上代码注册了⼀个不健康的实例并且设置了权重和元数据 对应的管理台效果为 服务发现 服务注册之后服务消费者就可以来使⽤了我们可以使⽤如下api来获取某个服务的所有实例信息 NamingService naming NamingFactory.createNamingService(localhost:8848); System.out.println(naming.getAllInstances(app1)); 也可以获取所有健康的实例 naming.selectInstances(app1, true) 可以直接某⼀个健康的实例权重随机算法 naming.selectOneHealthyInstance(app1) 通常作为服务消费者还需要监听服务实例化的变化我们可以使⽤如下api来监听变化 NamingService naming NamingFactory.createNamingService(localhost:8848); naming.subscribe(app1, event - { if (event instanceof NamingEvent) { System.out.println(((NamingEvent) event).getServiceName()); System.out.println(((NamingEvent) event).getInstances()); } }); 以上是Nacos提供了Java SDK的常⽤API熟悉这些API能更好的理解或深⼊研究Nacos。 Spring/SpringBoot 直接使⽤Java SDK的⽅式来进⾏服务注册和发现⽐较麻烦不过⽬前在Spring和SpringBoot中使⽤也不怎么⽅便可以⾃⾏参考官⽹的教程 https://nacos.io/zh-cn/docs/quick-start-spring-boot.html SpringCloud 我们直接来看SpringCloud中如何使⽤Nacos来进⾏服务注册和发现 ⾸先添加依赖 dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId version2.2.8.RELEASE/version /dependency 服务提供者 在服务提供者的application.properties中配置 server.port8070 spring.application.nameservice-provider spring.cloud.nacos.discovery.server-addr127.0.0.1:8848 使⽤EnableDiscoveryClient来开启服务注册 SpringBootApplication EnableDiscoveryClient public class UserApplication { public static void main(String[] args) throws IOException { SpringApplication.run(UserApplication.class, args); } } 启动应⽤就能完成服务注册: 服务消费者  也是先添加依赖 dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId version2.2.8.RELEASE/version /dependency 再配置应⽤的application.properties⽂件 server.port 8080 spring.application.name service-consumer spring.cloud.nacos.discovery.server-addr 127.0.0.1:8848 然后使⽤EnableDiscoveryClient开启服务发现: SpringBootApplication EnableDiscoveryClient public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } } 然后通过定义⼀个 RestTemplate来发现http请求并使⽤LoadBalanced LoadBalanced Bean public RestTemplate restTemplate() { return new RestTemplate(); } 然后来使⽤RestTemplate调⽤服务 RestController public class ConsumerController {Autowiredprivate RestTemplate restTemplate;GetMapping(value /test)public String echo() {return restTemplate.getForObject(http://service-provider/test, S tring.class);} } 可以发现在SpringCloud中使⽤Nacos还是⽐较⽅便的。 ⾼级功能 接下来我们再来看看Nacos服务管理中⼀些⽐较⾼级的功能 临时实例与持久实例 默认情况下注册给nacos的实例都是临时实例临时实例表示会通过客户端与服务端之间的⼼跳来保活默认情况下客户端会每隔5 s发送⼀次⼼跳。 public static final long DEFAULT_HEART_BEAT_INTERVAL TimeUnit.SECONDS.toM illis(5); 在服务端测如果超过 15 s没有收到客户端的⼼跳那么就会把实例标记为不健康状态 public static final long DEFAULT_HEART_BEAT_TIMEOUT TimeUnit.SECONDS.toMi llis(15); 在服务端测如果超过 30 s没有收到客户端的⼼跳那么就会删除实例 public static final long DEFAULT_IP_DELETE_TIMEOUT TimeUnit.SECONDS.toMil lis(30); ⽽对于持久实例就算服务实例下线了那么也不会被删除我们可以通过 spring.cloud.nacos.discovery.ephemeralfalse 1 来配置为持久实例表示实例信息会持久化到磁盘中去。 那什么时候⽤持久实例呢我们可以发现持久实例与临时实例的区别在于持久实例会永远在线⽽临时实例不会所以如果消费端在某种情况下想拿到已经下线的实例的实例信息那么就可以把实例注册为持久实例。 保护阈值 在使⽤过程中我们可以设置⼀个 0 - 1 的⼀个⽐例表示如果服务的所有实例中健康实例的⽐重低于这个⽐重就会触发保护⼀旦触发保护在服务消费端侧就会把所有实例拉取下来不管是否健康这样就起到了保护的作⽤因为正常来说消费端只会拿到健康实例但是如果健康实例占总实例⽐例⽐较⼩了那么就会导致所有流量都会压到健康实例上这样仅剩的⼏个健康实例也会被压垮所以只要触发了保护消费端就会拉取到所有实例这样部分消费端仍然会访问到不健康的实例从⽽请求失败但是也有⼀部分请求能访问到健康实例达到保护的作⽤。 在SpringCloud Tencent中这个功能叫“全死全活”。 权重 ⼀个服务的多个实例可能对应的机器配置不同所以我们可以给不同的实例设置不同的权重⽐如  给 8070 这个实例设置了权重为 2 这样它的权重就是 8071 的两倍那么就应该要承受 2 被的流量。 不过我们在消费⼀个服务时通常是通过ribbon来进⾏负载均衡的所以默认情况下nacos配置的权重是起不到作⽤的因为ribbon使⽤的是⾃⼰的负载均衡策略⽽如果想要⽤到nacos的权重可以 Bean public IRule ribbonRule() { return new NacosRule(); } 这样就会利⽤到nacos中所配置的权重了。 Cluster就近访问 ⼀个服务下会有多个实例在nacos中可以将这些实例指定到不同的集群中⽐如可以通过 spring.cloud.nacos.discovery.cluster-namebj 这种⽅式来指定当前实例属于哪个集群⽐如  hz集群只有⼀个8070的实例bj集群有8071、8072两个实例。 此时在服务消费端也可以配置 spring.cloud.nacos.discovery.cluster-namebj 使得服务调⽤者也在bj集群那么此时服务消费者就只会调⽤到bj集群中的两个实例。 如果消费端没有配置cluster-name那么则会使⽤所有集群。 集群部署 在前⾯我们都是使⽤的单机模式部署的nacos服务端的为了保证nacos的⾼可⽤也就是保证配置中⼼和注册中⼼的⾼可⽤通常我们都需要以集群的⽅式来部署nacos server。 ⾸先我们修改conf/cluster⽂件把nacos集群中所有的节点的ip和port配置进去 192.168.65.46:8848 192.168.65.46:8858 192.168.65.46:8868 我这⾥是在我本机搭集群所以ip地址⼀样端⼝得不⼀样如果⼤家是在多个机器上搭机器则ip地址不⼀样端⼝可以⼀样也可以不⼀样通常是⼀样8848 。 如果多个机器来搭集群那么这么配置⼀下就可以了注意每个机器上得cluster⽂件都要配表示每个nacos节点都得知道⾃⼰所在集群的节点情况。 我这⾥在本地搭就需要多⼏个步骤。 先复制三份  每个⽂件夹的内容都是如下 分别修改三个cluster⽂件的内容都为 192.168.65.46:8848 192.168.65.46:8858 192.168.65.46:8868 再分别修改三个application.properties中的server.port为 8848 、 8858 、 8868 然后通过cmd分别进去三个⽂件夹中的bin⽬录运⾏ startup.cmd -p embedded 来启动三个节点 启动成功后   然后我们就可以通过 http://localhost: 8848 /nacos 、 http://localhost: 8858 /nacos 、 http://localhost: 8868 /nacos 这三个路径来访问nacos管理台效果是⼀样的。 并且可以看到集群的情况  不过我们我们在启动的时候使⽤了 startup.cmd -p embedded 表示使⽤内置数据源我们可以切换成mysql⾸先我们在⾃⼰的mysql中新建⼀个schema nacos_config 然后执⾏   然后执⾏该sql脚本去创建相关的表可以发现只有配置中⼼的配置信息才会存到mysql中注册中⼼的服务信息是不会存的。 然后修改application.properties⽂件中的 ### If use MySQL as datasource: spring.datasource.platformmysql ### Count of DB: db.num1 ### Connect URL of DB: db.url.0jdbc:mysql://127.0.0.1:3306/nacos2?characterEncodingutf8connect Timeout1000socketTimeout3000autoReconnecttrueuseUnicodetrueuseSSL falseserverTimezoneUTC db.user.0root db.password.0Zhouyu123456*** 三个节点都配好并且必须连接同⼀个数据库配好之后就可以直接使⽤startup.cmd来启动了。 那nacos集群搭建完之后对应我们的应⽤⽽⾔连接任意⼀个节点都可以或者可以配置配多个 spring.cloud.nacos.discovery.server-addr192.168.65.46:8848, 192.168.65.46: 8858, 192.168.65.46:8858 这样其中某个节点就算挂掉了对于应⽤⽽⾔也能从其他节点获取信息。 不过在应⽤上指定多个ip地址有⼀个缺点就是如果⼀旦ip地址发⽣变化那么就得修改所以我们可以在nacos集群之上在搭⼀个nginx。 先下载⼀个nginx然后修改conf/nginx配置⽂件 添加upstream upstream nacos-cluster { server 192.168.65.46:8848;server 192.168.65.46:8858;server 192.168.65.46:8868; } 添加location location /nacos { proxy_pass http://nacos-cluster; } 启动nginx后访问 http://localhost/nacos 就可以访问到nacos管理台了并且在应⽤中只需要配置 spring.cloud.nacos.discovery.server-addrlocalhost:80/nacos 即可进⾏服务注册与发现。
http://www.pierceye.com/news/204909/

相关文章:

  • 韶关网站建设公司电子商务网站建设考试重点
  • 网站左侧 导航小红书广告投放平台
  • 资阳住房和城乡建设厅网站重庆建设网站建站
  • 网站制作厂家电话多少女生学网络工程难吗
  • 网站建设要经历哪些步骤?网站建设岗位周计划
  • 贵阳网站制作工具福步外贸论坛网首页
  • 网站大全app下载任务发布平台
  • 专业商城网站建设哪家便宜河南做外贸网站的公司
  • seo博客网站东莞网络推广运营企业
  • 定制网站建设公司哪家好嘉兴网站建设多少时间
  • 快三竞猜网站建设wordpress 整站打包
  • 珠海好的网站制作平台微信音乐音频怎么关闭
  • asp.net 网站计数器响应式设计
  • 2017做那些网站致富小程序商城哪个平台好
  • 织梦制作网站如何上线做网站 当站长
  • 如何知道一个网站是用什么做的树莓派搭建wordpress
  • 怎么制作网站登录电子商务网上购物网站建设规划
  • 大连外贸网站制作做文案公众号策划兼职网站
  • 400网站建设推广通王网站内容管理系统
  • 上海专业网站制作开发wordpress 一级目录下
  • 要查询一个网站在什么公司做的推广怎么查济南集团网站建设报价
  • 手机静态网站建设课程设计报告形象型网站
  • 网站建设接单渠道百度网站内容
  • 企业网站pv是什么手机网站开发价格
  • 北京网站优化团队oppo开放平台
  • 购物商城外贸网站福州营销型网站建设公司
  • 白酒pc网站建设方案网站不符合个人备案性质
  • 做视频网站程序多少钱免费人体做爰网站
  • 做海外网站 服务器放哪网页设计师通常是设计两套ui吗
  • 海拉尔网站建设做html网站模板下载