新变更营业执照注册号查了发现之前有备案过网站了,潍坊专业联轴器收购价格,范湖网站建设团队,有没有做网站源代码修改的Spring Cloud Eureka 服务注册与发现 一、Eureka基础知识概述1.Eureka两个核心组件2.Eureka 服务注册与发现 二、Eureka单机搭建三、Eureka集群搭建四、心跳续约五、Eureka自我保护机制 一、Eureka基础知识概述 
1.Eureka两个核心组件 
Eureka Server #xff1a;服务注册中心… Spring Cloud Eureka 服务注册与发现 一、Eureka基础知识概述1.Eureka两个核心组件2.Eureka 服务注册与发现 二、Eureka单机搭建三、Eureka集群搭建四、心跳续约五、Eureka自我保护机制 一、Eureka基础知识概述 
1.Eureka两个核心组件 
Eureka Server 服务注册中心主要用于提供服务注册功能。 当微服务启动时会将自己的服务注册 到 Eureka Server。Eureka Server 维护了一个可用服务列表存储了所有注册到 Eureka Server 的可用服务的信息这些可用服务可以在 Eureka Server 的管理界面中直观看到Eureka Client 客户端通常指的是微服务系统中各个微服务主要用于和 Eureka Server 进行交互。 在微服务应用启动后Eureka Client 会向 Eureka Server 发送心跳默认周期为 30 秒。若 Eureka Server 在多个心跳周期内没有接收到某个 Eureka Client 的心跳Eureka Server 将它从可用服务列表中移除默认 90 秒 Eureka的心跳机制主要用于确保客户端服务提供者与服务器服务注册中心之间的连接活性。客户端启动后会定期向服务器发送心跳数据以告知服务器自己仍然处于活动状态 2.Eureka 服务注册与发现 服务注册中心Register Service 它是一个 Eureka Server用于提供服务注册和发现功能。服务提供者Provider Service 它是一个 Eureka Client用于提供服务。它将自己提供的服务注册到服务注册中心以供服务消费者发现。服务消费者Consumer Service 它是一个 Eureka Client用于消费服务。它可以从服务注册中心获取服务列表调用所需的服务。 
Eureka 实现服务注册与发现的流程 
搭建一个Eureka Server作为服务注册中心服务提供者Eureka Client启动时会把当前服务器的信息以服务名spring.application.name的方式注册到服务注册中心服务消费者Eureka Client启动时也会向服务注册中心注册服务消费者还会获取一份可用路由服务列表该列表中包含了所有注册到服务注册中心的服务信息包括服务提供者和自身的信息在获得了可用服务列表后服务消费者通过 HTTP 或消息中间件远程调用服务提供者提供的服务。服务注册中心Eureka Server所扮演的角色十分重要它是服务提供者和服务消费者之间的桥梁。服务提供者只有将自己的服务注册到服务注册中心才可能被服务消费者调用而服务消费者也只有通过服务注册中心获取可用服务列表后才能调用所需的服务。 二、Eureka单机搭建 
1.构建父模块和三个子模块 分别为注册中心 eureka-service 仓储模块stock-service 订单模块 order-service  2.父模块pom.xml文件 
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdorg.example/groupIdartifactIdcloud-02-Eureka-parent/artifactIdpackagingpom/packagingversion1.0-SNAPSHOT/versionmodulesmodulecloud-eureka-service/modulemodulecloud-stock-service/modulemodulecloud-order-service/module/modules!-- 统一管理jar包版本 --propertiesproject.build.sourceEncodingUTF-8/project.build.sourceEncodingmaven.compiler.source1.8/maven.compiler.sourcemaven.compiler.target1.8/maven.compiler.targetjunit.version4.12/junit.versionlog4j.version1.2.17/log4j.versionlombok.version1.18.22/lombok.versionmysql.version8.0.24/mysql.versiondruid.version1.2.8/druid.versionmybatis-plus.version3.0.7.1/mybatis-plus.version/propertiesdependencies!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!-- https://mvnrepository.com/artifact/com.alibaba/druid --dependencygroupIdcom.alibaba/groupIdartifactIddruid-spring-boot-starter/artifactIdversion1.2.8/version/dependency!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactId/dependency!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-jdbc --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-jdbc/artifactId/dependency!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependencydependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion${mybatis-plus.version}/versionoptionaltrue/optionalexclusionsexclusiongroupIdcom.baomidou/groupIdartifactIdmybatis-plus-generator/artifactId/exclusion/exclusions/dependency/dependencies!-- 子模块继承之后提供作用锁定版本子modlue不用写groupId和version  --dependencyManagementdependencies!--spring boot 2.2.2--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-dependencies/artifactIdversion2.2.2.RELEASE/versiontypepom/typescopeimport/scope/dependency!--spring cloud Hoxton.SR1--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-dependencies/artifactIdversionHoxton.SR1/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagementbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdconfigurationaddResourcestrue/addResources/configuration/plugin/plugins/build
/project3.对cloud-eureka-service注册中心操作 3.1 pom.xml文件 dependencies!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka-server --dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-server/artifactId/dependency/dependencies3.2 主启动类 
// 添加数据库和 druid 却未配置
// 则添加 exclude  {DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class}
// 则启动报错
SpringBootApplication(exclude  {DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class})
EnableEurekaServer//告诉服务器我是一个注册中心
public class EurekaServiceApplication {public static void main(String[] args) {SpringApplication.run(EurekaServiceApplication.class,args);}
}3.3 application.yml 
server:port: 8001
eureka:instance:hostname: 127.0.0.1  #eureka服务端的实例名字127.0.0.1 或 localhostclient:#表识不向注册中心注册自己register-with-eureka: false#表示自己就是注册中心职责是维护服务实例并不需要去检索服务fetch-registry: falseservice-url:#设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址#服务注册位置 http://127.0.0.1:8001/eureka/defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/4.对仓储模块cloud-stock-service操作 4.1 pom.xml dependenciesdependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-client/artifactId/dependency/dependencies4.2 主启动类 
SpringBootApplication(exclude  {DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class})
EnableEurekaClient//需要使用Eureka注册中心添加此注解
public class StockServiceApplication {public static void main(String[] args) {SpringApplication.run(StockServiceApplication.class,args);}
} 
4.3 application.yml 
server:port: 9001
spring:application:name: cloud-stock-service
eureka:client:# 向服务端注册register-with-eureka: true# 需要检索fetchRegistry: trueservice-url:defaultZone: http://localhost:8001/eureka4.4 StockController 
RestController
RequestMapping(/stock)
public class StockController {GetMapping(/subStock)public String subStock(){System.out.println(库存减1);return 库存减1;}
}5.对订单模块cloud-order-service操作 5.1 pom.xml文件 dependenciesdependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-client/artifactId/dependency/dependencies5.2 主启动类 
SpringBootApplication(exclude  {DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class})
EnableEurekaClient
public class OrderServiceApplication {public static void main(String[] args) {SpringApplication.run(OrderServiceApplication.class,args);}
} 
5.3 application.yml 
server:port: 7001
spring:application:name: cloud-order-servce
eureka:client:# 向服务端注册register-with-eureka: true# 需要检索fetchRegistry: trueservice-url:defaultZone: http://localhost:8001/eureka/5.4 OrderController 
RestController
RequestMapping(/order)
public class OrderController {//这里特别提醒 http:// 千万别忘加 本人因为这个错误找了很长时间 。。。。//CLOUD-STOCK-SERVICE 这里是eureka注册中心的名称private static final String HOST  http://CLOUD-STOCK-SERVICE;Autowiredprivate RestTemplate restTemplate;GetMapping(/addOrder)public String addOrder(){System.out.println(订单已完成);return restTemplate.getForObject(HOST  /stock/subStock,String.class);}
}5.5 RestTemplate配置类 
Configuration
public class ApplicationConfig {BeanLoadBalanced//负载均衡器public RestTemplate restTemplate(){return new RestTemplate();}
}6.启动设置 
我用的是idea 2021 ,多应用启动设置在如下位置  7.启动 7.1 先启动服务注册中心cloud-eureka-service 访问localhost:8001 7.2 在以端口号为9001和 9002 分别启动 cloud-stock-service 在yml文件 server.port更改 启动完成9001 更改端口号为9002 在启动一次 再次访问localhost:8001 7.3 在以端口号为7001和 7002 分别启动 cloud-order-service 和 7.2更改方式一样 访问 localhost:8001 8. **测试 ** 8.1 访问 localhost:7001/order/addOrder  8.2 观察控制台当我们多少刷新访问 localhost:7001/order/addOrder 则会出现9001和9002交替处理请求轮循缓解服务器压力选择服务规则和 LoadBalanced 负载均衡器有关  
试着访问localhost:7002,结果相同 三、Eureka集群搭建 在微服务架构中一个系统往往由十几甚至几十个服务组成若将这些服务全部注册到同一个 Eureka Server 中就极有可能导致 Eureka Server 因不堪重负而崩溃最终导致整个系统瘫痪。解决这个问题最直接的办法就是部署 Eureka Server 集群。 1.新建cloud-eureka-server-2和cloud-eureka-server-3  2.修改映射配置 
打开 C:\Windows\System32\drivers\etc 目录下的hosts文件 修改映射配置添加进hosts文件  3.更改yml文件 3.1 cloud-eureka-service-2的yml文件 
server:port: 8002
eureka:instance:hostname: eureka8002.com  #eureka服务端的实例名字client:#表识不向注册中心注册自己register-with-eureka: false#表示自己就是注册中心职责是维护服务实例并不需要去检索服务fetch-registry: falseservice-url:#设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址defaultZone: http://eureka8003.com:8003/eureka/3.2 cloud-eureka-service-2的yml文件 
server:port: 8003
eureka:instance:hostname: eureka8003.com  #eureka服务端的实例名字client:#表识不向注册中心注册自己register-with-eureka: false#表示自己就是注册中心职责是维护服务实例并不需要去检索服务fetch-registry: falseservice-url:#设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址defaultZone: http://eureka8002.com:8002/eureka/3.3 cloud-order-service的yml文件 
server:port: 7001
spring:application:name: cloud-order-servce
eureka:client:# 向服务端注册register-with-eureka: true# 需要检索fetchRegistry: trueservice-url:defaultZone: http://localhost:8002/eureka,http://localhost:8003/eureka3.3 cloud-stock-service的yml文件 
server:port: 9001
spring:application:name: cloud-stock-service
eureka:client:# 向服务端注册register-with-eureka: true# 需要检索fetchRegistry: trueservice-url:defaultZone: http://localhost:8002/eureka,http://localhost:8003/eureka 4.分别为cloud-eureka-service-2和cloud-eureka-service-3添加启动类 
SpringBootApplication(exclude  {DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class})
EnableEurekaServer//告诉服务器我是一个注册中心
public class EurekaServiceApplication2 {public static void main(String[] args) {SpringApplication.run(EurekaServiceApplication2.class,args);}
}
-----------------------------------------------------------------------------------------------------------------SpringBootApplication(exclude  {DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class})
EnableEurekaServer//告诉服务器我是一个注册中心
public class EurekaServiceApplication3 {public static void main(String[] args) {SpringApplication.run(EurekaServiceApplication3.class,args);}
}5.启动 5.1 启动cloud-eureka-service-2和cloud-eureka-service-3 5.1.1 访问localhost:8002  5.1.2 访问localhost:8003  5.2 启动cloud-order-service和 端口号为9001和9002的cloud-stock-service集群服 
5.2.1 访问localhost:8002  
5.2.2 访问localhost:8003  6.测试 多次访问localhost:7001 观察控制台  以上方式可以形成一组互相注册的 Eureka Server 集群当服务提供者发送注册请求到 Eureka Server 时Eureka Server 会将请求转发给集群中所有与之相连的 Eureka Server 上以实现 Eureka Server 之间的服务同步。 通过服务同步服务消费者可以在集群中的任意一台 Eureka Server 上获取服务提供者提供的服务。这样即使集群中的某个服务注册中心发生故障服务消费者仍然可以从集群中的其他 Eureka Server 中获取服务信息并调用而不会导致系统的整体瘫痪这就是 Eureka Server 集群的高可用性。 四、心跳续约 “心跳”指的是一段定时发送的自定义信息让对方知道自己“存活”以确保连接的有效性。大部分 CS 架构的应用程序都采用了心跳机制服务端和客户端都可以发心跳。通常情况下是客户端向服务器端发送心跳包服务端用于判断客户端是否在线 心跳续约是指服务实例Eureka客户端定期向Eureka服务器发送心跳包以证明其仍然在线并愿意继续提供服务。Eureka服务器会根据这些心跳包来更新服务实例的活跃状态并维护一个可用的服务实例列表。 功能介绍 
Spring Cloud A 和 Spring Cloud B可以看作两个服务的提供者 Spring Cloud C 相当于 服务的消费者 定时默认30秒获取服务列表 registry服务注册列表 里面存储的是 各个注册服务的 名称 ip 端口号 readWriteCacheMap 会实时同步registry注册列表中的数据 readOnlyCacheMap 默认每30秒去同步一次readWriterCacheMap对象中的数据 详细流程 
A和B 服务 向Eureka Service 服务注册列表中注册服务 将自己的服务名称 ip  端口号注册到 registry服务注册列表。A和B每隔30秒 (默认30秒) 发送 一次心跳任务告诉Eureka 我还活着 registry服务注册列表 同步数据到readWriteCacheMapC 服务 通过readOnlyCacheMap 每30秒拉去一次注册表数据这个数据不是同步的而是30秒默认30秒更新一次这也是有时我们会在UI界面上看到服务注册成功调用时却出现错误的原因。同理服务下线也存在同样的问题服务已经下线了但是还是有客户端在调用已经下线的服务这时就会出现连接拒绝的错误。我们在Eureka UI页面上看到的注册信息实际上并没有走readOnlyCacheMap而是直接通过registry服务注册列表获取所以我们能够在Eureka UI页面实时的看到注册的新服务。服务续约默认是30秒 定时请理60秒清理一次超过90秒未续约的服务也就是说在连续3次丢失心跳后会被Eureka Server的evict线程清理最极端的情况服务下线后可能需要延迟180s之后Eureka Server中的registry对象才会被更新。 
综上分析在非手动清除的情况下缓存需要180秒才能感知下线的服务这种情况在生产环境中非常严重。 上述问题中我们可以更改默认值来解决感知下线服务时间过长问题 
Eureka注册中心 
eureka:server:#清理无效服务间隔 (默认60秒)eviction-interval-timer-in-ms: 1000#同步readWrite到readOnly间隔(默认30秒)response-cache-update-interval-ms: 10000#Client直接从readWriteCacheMap更新服#use-read-only-response-cache: false服务提供者 
eureka:instance:# Eureka注册中心服务端在收到客户端心跳之后#等待下一次心跳的超时时间如果在这个时间内没有收到下次心跳则移除该客户端。默认90秒lease-expiration-duration-in-seconds: 5# 客户端向注册中心发送心跳的时间间隔默认30秒lease-renewal-interval-in-seconds: 2五、Eureka自我保护机制 Eureka的自我保护机制是一种应对网络异常的安全保护措施宁可同时保留所有微服务健康的服务和不健康的服务都会保留也不盲目移除任何健康的服务。 当我们在本地调试基于 Eureka 的程序时Eureka 服务注册中心很有可能会出现红色警告。  实际上这个警告是触发了 Eureka 的自我保护机制而出现的。默认情况下如果 Eureka Server 在一段时间内没有接收到某个服务提供者的心跳就会将这个服务提供者提供的服务从服务注册表中移除。 这样服务消费者就再也无法从服务注册中心中获取到这个服务了更无法调用该服务。  但在实际的分布式微服务系统中健康的服务也有可能会由于网络故障例如网络延迟、卡顿等原因而无法与 Eureka Server正常通讯。若此时 Eureka Server因为没有接收心跳而误将健康的服务从服务列表中移除这显然是不合理的。而 Eureka 的自我保护机制就是来解决此问题的。  所谓 “Eureka 的自我保护机制”其中心思想就是“好死不如赖活着”。如果 Eureka Server 在一段时间内没有接收到 Eureka Client 的心跳那么 Eureka Server 就会开启自我保护模式将所有的 Eureka Client 的注册信息保护起来而不是直接从服务注册表中移除。一旦网络恢复这些 Eureka Client 提供的服务还可以继续被服务消费者消费。  默认情况下Eureka 的自我保护机制是开启的如果想要关闭则需要在配置文件中添加以下配置 
eureka:server:# false 关闭 Eureka 的自我保护机制默认是开启enable-self-preservation: false 需要注意的是 
Eureka 的自我保护机制也存在弊端。如果在 Eureka 自我保护机制触发期间服务提供者提供的服务出现问题那么服务消费者就很容易获取到已经不存在的服务进而出现调用失败的情况。此时我们可以通过客户端的容错机制来解决此问题 文章转载自: http://www.morning.fxwkl.cn.gov.cn.fxwkl.cn http://www.morning.lbgsh.cn.gov.cn.lbgsh.cn http://www.morning.ldfcb.cn.gov.cn.ldfcb.cn http://www.morning.ryxdf.cn.gov.cn.ryxdf.cn http://www.morning.zqbrd.cn.gov.cn.zqbrd.cn http://www.morning.rqlzz.cn.gov.cn.rqlzz.cn http://www.morning.yxbrn.cn.gov.cn.yxbrn.cn http://www.morning.lpcct.cn.gov.cn.lpcct.cn http://www.morning.dbddm.cn.gov.cn.dbddm.cn http://www.morning.yfqhc.cn.gov.cn.yfqhc.cn http://www.morning.jzgxp.cn.gov.cn.jzgxp.cn http://www.morning.bmbnc.cn.gov.cn.bmbnc.cn http://www.morning.trmpj.cn.gov.cn.trmpj.cn http://www.morning.yymlk.cn.gov.cn.yymlk.cn http://www.morning.htbbp.cn.gov.cn.htbbp.cn http://www.morning.cfrz.cn.gov.cn.cfrz.cn http://www.morning.coatingonline.com.cn.gov.cn.coatingonline.com.cn http://www.morning.ltpph.cn.gov.cn.ltpph.cn http://www.morning.fxwkl.cn.gov.cn.fxwkl.cn http://www.morning.sxlrg.cn.gov.cn.sxlrg.cn http://www.morning.zqcsj.cn.gov.cn.zqcsj.cn http://www.morning.ndzhl.cn.gov.cn.ndzhl.cn http://www.morning.gppqf.cn.gov.cn.gppqf.cn http://www.morning.hrnrx.cn.gov.cn.hrnrx.cn http://www.morning.bwnd.cn.gov.cn.bwnd.cn http://www.morning.xrct.cn.gov.cn.xrct.cn http://www.morning.gnmhy.cn.gov.cn.gnmhy.cn http://www.morning.qcmhs.cn.gov.cn.qcmhs.cn http://www.morning.wjwfj.cn.gov.cn.wjwfj.cn http://www.morning.wwxg.cn.gov.cn.wwxg.cn http://www.morning.ailvturv.com.gov.cn.ailvturv.com http://www.morning.kyfrl.cn.gov.cn.kyfrl.cn http://www.morning.zbqsg.cn.gov.cn.zbqsg.cn http://www.morning.dmtbs.cn.gov.cn.dmtbs.cn http://www.morning.gtmgl.cn.gov.cn.gtmgl.cn http://www.morning.rsbqq.cn.gov.cn.rsbqq.cn http://www.morning.stxg.cn.gov.cn.stxg.cn http://www.morning.wztlr.cn.gov.cn.wztlr.cn http://www.morning.wztnh.cn.gov.cn.wztnh.cn http://www.morning.llqky.cn.gov.cn.llqky.cn http://www.morning.lbrwm.cn.gov.cn.lbrwm.cn http://www.morning.khdw.cn.gov.cn.khdw.cn http://www.morning.pghgq.cn.gov.cn.pghgq.cn http://www.morning.xdxpq.cn.gov.cn.xdxpq.cn http://www.morning.njpny.cn.gov.cn.njpny.cn http://www.morning.ycmpk.cn.gov.cn.ycmpk.cn http://www.morning.kkwbw.cn.gov.cn.kkwbw.cn http://www.morning.bmlcy.cn.gov.cn.bmlcy.cn http://www.morning.hphfy.cn.gov.cn.hphfy.cn http://www.morning.xlclj.cn.gov.cn.xlclj.cn http://www.morning.qxljc.cn.gov.cn.qxljc.cn http://www.morning.xpqdf.cn.gov.cn.xpqdf.cn http://www.morning.grjh.cn.gov.cn.grjh.cn http://www.morning.uytae.cn.gov.cn.uytae.cn http://www.morning.fbxlj.cn.gov.cn.fbxlj.cn http://www.morning.xpfwr.cn.gov.cn.xpfwr.cn http://www.morning.chfxz.cn.gov.cn.chfxz.cn http://www.morning.nqbcj.cn.gov.cn.nqbcj.cn http://www.morning.rxyz.cn.gov.cn.rxyz.cn http://www.morning.lnmby.cn.gov.cn.lnmby.cn http://www.morning.ykrss.cn.gov.cn.ykrss.cn http://www.morning.fdxhk.cn.gov.cn.fdxhk.cn http://www.morning.jxtbr.cn.gov.cn.jxtbr.cn http://www.morning.trjp.cn.gov.cn.trjp.cn http://www.morning.dbsch.cn.gov.cn.dbsch.cn http://www.morning.cfmrb.cn.gov.cn.cfmrb.cn http://www.morning.gxqpm.cn.gov.cn.gxqpm.cn http://www.morning.fnnkl.cn.gov.cn.fnnkl.cn http://www.morning.qyglt.cn.gov.cn.qyglt.cn http://www.morning.mdrnn.cn.gov.cn.mdrnn.cn http://www.morning.nmbbt.cn.gov.cn.nmbbt.cn http://www.morning.zqnmp.cn.gov.cn.zqnmp.cn http://www.morning.kpxky.cn.gov.cn.kpxky.cn http://www.morning.bgqr.cn.gov.cn.bgqr.cn http://www.morning.mmclj.cn.gov.cn.mmclj.cn http://www.morning.fylsz.cn.gov.cn.fylsz.cn http://www.morning.fkyrk.cn.gov.cn.fkyrk.cn http://www.morning.gqryh.cn.gov.cn.gqryh.cn http://www.morning.lsjgh.cn.gov.cn.lsjgh.cn http://www.morning.wgcng.cn.gov.cn.wgcng.cn