【Spring Cloud学习笔记】【3/2】下篇

本文详细介绍了如何构建Eureka服务注册中心集群,包括配置Eureka Server 7001和7002,以及服务提供者和消费者的注册。通过设置Eureka的自我保护模式,确保在网络不稳定时仍能保持服务注册信息。同时讨论了微服务的负载均衡和健康检查,展示了如何在服务消费端启用超时控制和日志增强。最后,简要提及了Hystrix服务降级、熔断和限流的概念,并引入了JMeter进行高并发压力测试。
摘要由CSDN通过智能技术生成

服务注册:将服务信息注册进注册中心

服务发现:从注册中心上获取服务信息

实质:存key服务命取value闭用地址

1先启动eureka注主册中心

2启动服务提供者payment支付服务

3支付服务启动后会把自身信息(比服务地址L以别名方式注朋进eureka

4消费者order服务在需要调用接口时,使用服务别名去注册中心获取实际的RPC远程调用地址

5消去者导调用地址后,底屋实际是利用HttpClient技术实现远程调用

6消费者实癸导服务地址后会缓存在本地jvm内存中,默认每间隔30秒更新—次服务调用地址

问题:微服务RPC远程服务调用最核心的是什么
高可用,试想你的注册中心只有一个only one,万一它出故障了,会导致整个为服务环境不可用。

解决办法:搭建Eureka注册中心集群,实现负载均衡+故障容错。

互相注册,相互守望。

20_Eureka集群环境构建
创建cloud-eureka-server7002工程,过程参考16_EurekaServer服务端安装

Eureka 
7001
Eureka 
7002
找到C:\Windows\System32\drivers\etc路径下的hosts文件,修改映射配置添加进hosts文件
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com

修改cloud-eureka-server7001配置文件
server:
  port: 7001

eureka:
  instance:
    hostname: eureka7001.com #eureka服务端的实例名称
  client:
    register-with-eureka: false     #false表示不向注册中心注册自己。
    fetch-registry: false     #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:
    #集群指向其它eureka
      defaultZone: http://eureka7002.com:7002/eureka/
    #单机就是7001自己
      #defaultZone: http://eureka7001.com:7001/eureka/

修改cloud-eureka-server7002配置文件
server:
  port: 7002

eureka:
  instance:
    hostname: eureka7002.com #eureka服务端的实例名称
  client:
    register-with-eureka: false     #false表示不向注册中心注册自己。
    fetch-registry: false     #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:
    #集群指向其它eureka
      defaultZone: http://eureka7001.com:7001/eureka/
    #单机就是7002自己
      #defaultZone: http://eureka7002.com:7002/eureka/

实践的时候,遇到异常情况

在开启cloud-eureka-server7002时,开启失败,说7002端口被占用,然后在cmd中输入netstat -ano | find "7002",查不到任何东西。

纳闷一阵,重启电脑,问题解决。

21_订单支付两微服务注册进Eureka集群
将支付服务8001微服务,订单服务80微服务发布到上面2台Eureka集群配置中
将它们的配置文件的eureka.client.service-url.defaultZone进行修改

eureka:
  client:
    #表示是否将自己注册进Eurekaserver默认为true。
    register-with-eureka: true
    #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetchRegistry: true
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka, http://eureka7002.com:7002/eureka

测试01
先要启动EurekaServer,7001/7002服务
再要启动服务提供者provider,8001
再要启动消费者,80
浏览器输入 - http://localhost/consumer/payment/get/1
22_支付微服务集群配置
支付服务提供者8001集群环境构建

参考cloud-provicer-payment8001

1.新建cloud-provider-payment8002

2.改POM

3.写YML - 端口8002

4.主启动

5.业务类

6.修改8001/8002的Controller,添加serverPort

@RestController
@Slf4j
public class PaymentController{

    @Value("${server.port}")
    private String serverPort;//添加serverPort

    @PostMapping(value = "/payment/create")
    public CommonResult create(@RequestBody Payment payment)
    {
        int result = paymentService.create(payment);
        log.info("*****插入结果:" + result);

        if(result > 0) {
            return new CommonResult(200,"插入数据库成功,serverPort: "+serverPort/*添加到此处*/, result);
        }else{
            return new CommonResult(444,"插入数据库失败",null);
        }
    }
}

负载均衡

cloud-consumer-order80订单服务访问地址不能写死

@Slf4j
@RestController
public class OrderController {

    //public static final String PAYMENT_URL = "http://localhost:8001";
    public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";

使用@LoadBalanced注解赋予RestTemplate负载均衡的能力

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class ApplicationContextConfig {

    @Bean
    @LoadBalanced//使用@LoadBalanced注解赋予RestTemplate负载均衡的能力
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }

ApplicationContextBean - 提前说一下Ribbon的负载均衡功能

测试

先要启动EurekaServer,7001/7002服务

再要启动服务提供者provider,8001/8002服务

浏览器输入 - http://localhost/consumer/payment/get/31

结果:负载均衡效果达到,8001/8002端口交替出现

Ribbon和Eureka整合后Consumer可以直接调用服务而不用再关心地址和端口号,且该服务还有负载功能。

相互注册,相互守望

23_actuator微服务信息完善
主机名称:服务名称修改(也就是将IP地址,换成可读性高的名字)

修改cloud-provider-payment8001,cloud-provider-payment8002

修改部分 - YML - eureka.instance.instance-id

eureka:
  ...
  instance:
    instance-id: payment8001 #添加此处

修改之后

eureka主页将显示payment8001,payment8002代替原来显示的IP地址。

访问信息有IP信息提示,(就是将鼠标指针移至payment8001,payment8002名下,会有IP地址提示)

修改部分 - YML - eureka.instance.prefer-ip-address

eureka:
  ...
  instance:
    instance-id: payment8001 
    prefer-ip-address: true #添加此处eureka: ... instance: instance-id: payment8002 prefer-ip-address: true #添加此处

24_服务发现Discovery
对于注册进eureka里面的微服务,可以通过服务发现来获得该服务的信息

修改cloud-provider-payment8001的Controller
@RestController
@Slf4j
public class PaymentController{
    ...
    
    @Resource
    private DiscoveryClient discoveryClient;

    ...

    @GetMapping(value = "/payment/discovery")
    public Object discovery()
    {
        List<String> services = discoveryClient.getServices();
        for (String element : services) {
            log.info("*****element: "+element);
        }

        List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
        for (ServiceInstance instance : instances) {
            log.info(instance.getServiceId()+"\t"+instance.getHost()+"\t"+instance.getPort()+"\t"+instance.getUri());
        }

        return this.discoveryClient;
    }
}

8001主启动类
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient//添加该注解
public class PaymentMain001 {

    public static void main(String[] args) {
        SpringApplication.run(PaymentMain001.class, args);
    }

自测
先要启动EurekaSeryer

再启动8001主启动类,需要稍等一会儿

浏览器输入http://localhost:8001/payment/discovery

浏览器输出:

{"services":["cloud-payment-service"],"order":0}

后台输出:

*****element: cloud-payment-service
CLOUD-PAYMENT-SERVICE	192.168.199.218	8001	http://192.168.199.218:8001

25_Eureka自我保护理论知识
概述

保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据,也就是不会注销任何微服务。

如果在Eureka Server的首页看到以下这段提示,则说明Eureka进入了保护模式:

EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY’RE NOT. RENEWALS ARE LESSER THANTHRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUSTTO BE SAFE

导致原因

一句话:某时刻某一个微服务不可用了,Eureka不会立刻清理,依旧会对该微服务的信息进行保存。

属于CAP里面的AP分支。

为什么会产生Eureka自我保护机制?

为了EurekaClient可以正常运行,防止与EurekaServer网络不通情况下,EurekaServer不会立刻将EurekaClient服务剔除

什么是自我保护模式?

默认情况下,如果EurekaServer在一定时间内没有接收到某个微服务实例的心跳,EurekaServer将会注销该实例(默认90秒)。但是当网络分区故障发生(延时、卡顿、拥挤)时,微服务与EurekaServer之间无法正常通信,以上行为可能变得非常危险了——因为微服务本身其实是健康的,此时本不应该注销这个微服务。Eureka通过“自我保护模式”来解决这个问题——当EurekaServer节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我

保护模式。

自我保护机制∶默认情况下EurekaClient定时向EurekaServer端发送心跳包

如果Eureka在server端在一定时间内(默认90秒)没有收到EurekaClient发送心跳包,便会直接从服务注册列表中剔除该服务,但是在短时间( 90秒中)内丢失了大量的服务实例心跳,这时候Eurekaserver会开启自我保护机制,不会剔除该服务(该现象可能出现在如果网络不通但是EurekaClient为出现宕机,此时如果换做别的注册中心如果一定时间内没有收到心跳会将剔除该服务,这样就出现了严重失误,因为客户端还能正常发送心跳,只是网络延迟问题,而保护机制是为了解决此问题而产生的)。

在自我保护模式中,Eureka Server会保护服务注册表中的信息,不再注销任何服务实例。

它的设计哲学就是宁可保留错误的服务注册信息,也不盲目注销任何可能健康的服务实例。一句话讲解:好死不如赖活着。

综上,自我保护模式是一种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留)也不盲目注销任何健康的微服务。使用自我保护模式,可以让Eureka集群更加的健壮、稳定。

26_怎么禁止自我保护
在eurekaServer端7001处设置关闭自我保护机制
出厂默认,自我保护机制是开启的

使用eureka.server.enable-self-preservation = false可以禁用自我保护模式

eureka:
  ...
  server:
    #关闭自我保护机制,保证不可用服务被及时踢除
    enable-self-preservation: false
    eviction-interval-timer-in-ms: 2000

关闭效果:

spring-eureka主页会显示出一句:

THE SELF PRESERVATION MODE IS TURNED OFF. THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.

生产者客户端eureakeClient端8001
默认:

eureka.instance.lease-renewal-interval-in-seconds=30

eureka.instance.lease-expiration-duration-in-seconds=90

eureka:
  ...
  instance:
    instance-id: payment8001
    prefer-ip-address: true
    #心跳检测与续约时间
    #开发时没置小些,保证服务关闭后注册中心能即使剔除服务
    #Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
    lease-renewal-interval-in-seconds: 1
    #Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时将剔除服务
    lease-expiration-duration-in-seconds: 2

测试
7001和8001都配置完成
先启动7001再启动8001
结果:先关闭8001,马上被删除了

27_Eureka停更说明
https://github.com/Netflix/eureka/wiki

Eureka 2.0 (Discontinued)

The existing open source work on eureka 2.0 is discontinued. The code base and artifacts that were released as part of the existing repository of work on the 2.x branch is considered use at your own risk.

Eureka 1.x is a core part of Netflix’s service discovery system and is still an active project.

我们用ZooKeeper代替Eureka功能。

28_支付服务注册进zookeeper
注册中心Zookeeper
zookeeper是一个分布式协调工具,可以实现注册中心功能

关闭Linux服务器防火墙后,启动zookeeper服务器

用到的Linux命令行:

systemctl stop firewalld关闭防火墙
systemctl status firewalld查看防火墙状态
ipconfig查看IP地址
ping查验结果
zookeeper服务器取代Eureka服务器,zk作为服务注册中心

视频里是用虚拟机CentOS开启ZooKeeper,我打算在本机启动ZooKeeper,具体操作参考ZooKeeper学习笔记。

服务提供者
1.新建名为cloud-provider-payment8004的Maven工程。

2.POM

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>LearnCloud</artifactId>
        <groupId>com.lun.springcloud</groupId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-provider-payment8004</artifactId>
    <dependencies>
        <!-- SpringBoot整合Web组件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
            <groupId>com.lun.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>
        <!-- SpringBoot整合zookeeper客户端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
            <!--先排除自带的zookeeper3.5.3 防止与3.4.9起冲突-->
            <exclusions>
                <exclusion>
                    <groupId>org.apache.zookeeper</groupId>
                    <artifactId>zookeeper</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--添加zookeeper3.4.9版本-->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.9</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

3.YML

#8004表示注册到zookeeper服务器的支付服务提供者端口号
server:
  port: 8004

#服务别名----注册zookeeper到注册中心名称
spring:
  application:
    name: cloud-provider-payment
  cloud:
    zookeeper:
      connect-string: 127.0.0.1:2181 # 192.168.111.144:2181 #

4.主启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient//该注解用于向使用consul或者zookeeper作为注册中心时注册服务
public class PaymentMain8004 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentMain8004.class, args);
    }
}

5.Controller

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.UUID;

@RestController
@Slf4j
public class PaymentController
{
    @Value("${server.port}")
    private String serverPort;

    @RequestMapping(value = "/payment/zk")
    public String paymentzk()
    {
        return "springcloud with zookeeper: "+serverPort+"\t"+ UUID.randomUUID().toString();

6.启动8004注册进zookeeper(要先启动zookeeper的server)

验证测试:浏览器 - http://localhost:8004/payment/zk

验证测试2 :接着用zookeeper客户端操作

[zk: localhost:2181(CONNECTED) 0] ls /
[services, zookeeper]
[zk: localhost:2181(CONNECTED) 1] ls /services/cloud-provider-payment
[a4567f50-6ad9-47a3-9fbb-7391f41a9f3d]
[zk: localhost:2181(CONNECTED) 2] get /services/cloud-provider-payment/a4567f50-6ad9-47a3-9fbb-7391f41a9f3d
{"name":"cloud-provider-payment","id":"a4567f50-6ad9-47a3-9fbb-7391f41a9f3d","address":"192.168.199.218","port":8004,"ss
lPort":null,"payload":{"@class":"org.springframework.cloud.zookeeper.discovery.ZookeeperInstance","id":"application-1","
name":"cloud-provider-payment","metadata":{}},"registrationTimeUTC":1612811116918,"serviceType":"DYNAMIC","uriSpec":{"pa
rts":[{"value":"scheme","variable":true},{"value":"://","variable":false},{"value":"address","variable":true},{"value":"
:","variable":false},{"value":"port","variable":true}]}}
[zk: localhost:2181(CONNECTED) 3]

json格式化get /services/cloud-provider-payment/a4567f50-6ad9-47a3-9fbb-7391f41a9f3d的结果:

{
    "name": "cloud-provider-payment", 
    "id": "a4567f50-6ad9-47a3-9fbb-7391f41a9f3d", 
    "address": "192.168.199.218", 
    "port": 8004, 
    "sslPort": null, 
    "payload": {
        "@class": "org.springframework.cloud.zookeeper.discovery.ZookeeperInstance", 
        "id": "application-1", 
        "name": "cloud-provider-payment", 
        "metadata": { }
    }, 
    "registrationTimeUTC": 1612811116918, 
    "serviceType": "DYNAMIC", 
    "uriSpec": {
        "parts": [
            {
                "value": "scheme", 
                "variable": true
            }, 
            {
                "value": "://", 
                "variable": false
            }, 
            {
                "value": "address", 
                "variable": true
            }, 
            {
                "value": ":", 
                "variable": false
            }, 
            {
                "value": "port", 
                "variable": true
            }
        ]
    }
}

29_临时还是持久节点
ZooKeeper的服务节点是临时节点,没有Eureka那含情脉脉。

30_订单服务注册进zookeeper
1.新建cloud-consumerzk-order80

2.POM

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>LearnCloud</artifactId>
        <groupId>com.lun.springcloud</groupId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-consumerzk-order80</artifactId>

    <dependencies>
        <!-- SpringBoot整合Web组件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- SpringBoot整合zookeeper客户端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
            <!--先排除自带的zookeeper-->
            <exclusions>
                <exclusion>
                    <groupId>org.apache.zookeeper</groupId>
                    <artifactId>zookeeper</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--添加zookeeper3.4.9版本-->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.9</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

3.YML

server:
  port: 80

#服务别名----注册zookeeper到注册中心名称
spring:
  application:
    name: cloud-consumer-order
  cloud:
    zookeeper:
      connect-string: 127.0.0.1:2181 # 192.168.111.144:2181 #

4.主启动

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class OrderZKMain80 {
    public static void main(String[] args) {
        SpringApplication.run(OrderZKMain80.class, args);
    }

5.业务类

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class ApplicationContextConfig
{
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate()
    {
        return new RestTemplate();

import javax.annotation.Resource;

@RestController
@Slf4j
public class OrderZKController
{
    public static final String INVOKE_URL = "http://cloud-provider-payment";

    @Resource
    private RestTemplate restTemplate;

    @GetMapping(value = "/consumer/payment/zk")
    public String paymentInfo()
    {
        String result = restTemplate.getForObject(INVOKE_URL+"/payment/zk",String.class);
        return result;
    }

6.验证测试

运行ZooKeeper服务端,cloud-consumerzk-order80,cloud-provider-payment8004。

打开ZooKeeper客户端:

[zk: localhost:2181(CONNECTED) 0] ls /
[services, zookeeper]
[zk: localhost:2181(CONNECTED) 1] ls /services
[cloud-consumer-order, cloud-provider-payment]
[zk: localhost:2181(CONNECTED) 2]

7.访问测试地址 - http://localhost/consumer/payment/zk

31_Consul简介
Consul官网

Consul下载地址

What is Consul?

Consul is a service mesh solution providing a full featured control plane with service discovery, configuration, and segmentation functionality. Each of these features can be used individually as needed, or they can be used together to build a full service mesh. Consul requires a data plane and supports both a proxy and native integration model. Consul ships with a simple built-in proxy so that everything works out of the box, but also supports 3rd party proxy integrations such as Envoy. link

Consul是一个服务网格解决方案,它提供了一个功能齐全的控制平面,具有服务发现、配置和分段功能。这些特性中的每一个都可以根据需要单独使用,也可以一起用于构建全服务网格。Consul需要一个数据平面,并支持代理和本机集成模型。Consul船与一个简单的内置代理,使一切工作的开箱即用,但也支持第三方代理集成,如Envoy。

consul
英 [ˈkɒnsl] 美 [ˈkɑːnsl]
n. 领事

Consul是一套开源的分布式服务发现和配置管理系统,由HashiCorp 公司用Go语言开发。

提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服务网格,总之Consul提供了一种完整的服务网格解决方案。

它具有很多优点。包括:基于raft协议,比较简洁;支持健康检查,同时支持HTTP和DNS协议支持跨数据中心的WAN集群提供图形界面跨平台,支持Linux、Mac、Windows。

The key features of Consul are:

Service Discovery: Clients of Consul can register a service, such as api or mysql, and other clients can use Consul to discover providers of a given service. Using either DNS or HTTP, applications can easily find the services they depend upon.
Health Checking: Consul clients can provide any number of health checks, either associated with a given service (“is the webserver returning 200 OK”), or with the local node (“is memory utilization below 90%”). This information can be used by an operator to monitor cluster health, and it is used by the service discovery components to route traffic away from unhealthy hosts.
KV Store: Applications can make use of Consul’s hierarchical key/value store for any number of purposes, including dynamic configuration, feature flagging, coordination, leader election, and more. The simple HTTP API makes it easy to use.
Secure Service Communication: Consul can generate and distribute TLS certificates for services to establish mutual TLS connections. Intentions can be used to define which services are allowed to communicate. Service segmentation can be easily managed with intentions that can be changed in real time instead of using complex network topologies and static firewall rules.
Multi Datacenter: Consul supports multiple datacenters out of the box. This means users of Consul do not have to worry about building additional layers of abstraction to grow to multiple regions.
link

能干嘛?

服务发现 - 提供HTTP和DNS两种发现方式。
健康监测 - 支持多种方式,HTTP、TCP、Docker、Shell脚本定制化
KV存储 - Key、Value的存储方式
多数据中心 - Consul支持多数据中心
可视化Web界面
怎么玩

32_安装并运行Consul
官网安装说明

windows版解压缩后,得consul.exe,打开cmd

查看版本consul -v:
D:\Consul>consul -v
Consul v1.9.3
Revision f55da9306
Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatib

开发模式启动consul agent -dev:
浏览器输入 - http://localhost:8500/ - 打开Consul控制页。

33_服务提供者注册进Consul
1.新建Module支付服务provider8006

2.POM

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>LearnCloud</artifactId>
        <groupId>com.lun.springcloud</groupId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-providerconsul-payment8006</artifactId>
    <dependencies>
        <!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
        <dependency>
            <groupId>com.lun.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>
        <!--SpringCloud consul-server -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
        <!-- SpringBoot整合Web组件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--日常通用jar包配置-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>RELEASE</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>RELEASE</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

3.YML

###consul服务端口号
server:
  port: 8006

spring:
  application:
    name: consul-provider-payment
####consul注册中心地址
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        #hostname: 127.0.0.1
        service-name: ${spring.application.name}

4.主启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain8006
{
    public static void main(String[] args) {
            SpringApplication.run(PaymentMain8006.class, args);
    }
}

5.业务类Controller

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.UUID;

@RestController
@Slf4j
public class PaymentController
{
    @Value("${server.port}")
    private String serverPort;

    @RequestMapping(value = "/payment/consul")
    public String paymentConsul()
    {
        return "springcloud with consul: "+serverPort+"\t   "+ UUID.randomUUID().toString();
    }

6.验证测试

http://localhost:8006/payment/consul
http://localhost:8500 - 会显示provider8006
34_服务消费者注册进Consul
1.新建Module消费服务order80 - cloud-consumerconsul-order80

2.POM

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>LearnCloud</artifactId>
        <groupId>com.lun.springcloud</groupId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-consumerconsul-order80</artifactId>
    <dependencies>
        <!--SpringCloud consul-server -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
        <!-- SpringBoot整合Web组件 -->
        <dependency>

www.huoxing24.com/search/%E8%80%81%E8%A1%97%E8%85%BE%E9%BE%99%E5%A8%B1%E4%B9%90%E6%B8%B8%E6%88%8F%E7%BD%91%E5%9D%80-19869481847
https://search.jd.com/Search?keyword=%E6%AC%A7%E4%BA%9A%E5%9B%BD%E9%99%85%E6%B3%A8%E5%86%8C%E7%BD%91%E5%9D%80-19869481847&enc=utf-8&pvid=5512fd7b531e458abf0a7cd60bf38f31
https://www.douban.com/search?q=%E8%80%81%E8%A1%97%E8%85%BE%E9%BE%99%E5%A8%B1%E4%B9%90%E6%B3%A8%E5%86%8C%E5%AE%98%E7%BD%91-19869481847
https://www.ixigua.com/search/%E8%80%81%E8%A1%97%E6%96%B0%E7%99%BE%E8%83%9C%E5%85%AC%E5%8F%B8%E8%81%94%E7%B3%BB%E6%96%B9%E5%BC%8F-19869481847/?logTag=594535e3690f17a88cdb&tab_name=search
https://www.ixigua.com/search/%E8%80%81%E8%A1%97%E6%96%B0%E7%99%BE%E8%83%9C%E5%85%AC%E5%8F%B8%E8%81%94%E7%B3%BB%E6%96%B9%E5%BC%8F-19869481847/?logTag=594535e3690f17a88cdb&tab_name=search
https://search.jd.com/Search?keyword=%E6%AC%A7%E4%BA%9A%E5%9B%BD%E9%99%85%E5%AE%A2%E6%9C%8D%E7%94%B5%E8%AF%9D-19869481847&enc=utf-8&pvid=5512fd7b531e458abf0a7cd60bf38f31
https://search.jd.com/Search?keyword=%E6%AC%A7%E4%BA%9A%E5%9B%BD%E9%99%85%E8%81%94%E7%B3%BB%E6%96%B9%E5%BC%8F-19869481847&enc=utf-8&pvid=5512fd7b531e458abf0a7cd60bf38f31
https://www.douban.com/search?q=%E8%80%81%E8%A1%97%E8%85%BE%E9%BE%99%E5%A8%B1%E4%B9%90%E4%B8%8A%E4%B8%8B%E5%88%86-19869481847
https://www.ixigua.com/search/%E8%80%81%E8%A1%97%E8%85%BE%E9%BE%99%E5%A8%B1%E4%B9%90%E6%B8%B8%E6%88%8F%E7%BD%91%E5%9D%80-19869481847/?logTag=594535e3690f17a88cdb&tab_name=search
https://www.ixigua.com/search/%E8%80%81%E8%A1%97%E8%85%BE%E9%BE%99%E5%A8%B1%E4%B9%90%E6%B8%B8%E6%88%8F%E9%93%BE%E6%8E%A5-19869481847/?logTag=594535e3690f17a88cdb&tab_name=search
https://search.jd.com/Search?keyword=%E8%80%81%E8%A1%97%E6%96%B0%E7%99%BE%E8%83%9C%E5%85%AC%E5%8F%B8%E6%80%8E%E4%B9%88%E8%81%94%E7%B3%BB-19869481847&enc=utf-8&pvid=5512fd7b531e458abf0a7cd60bf38f31
https://www.migu.cn/search.html?content=%E8%80%81%E8%A1%97%E8%85%BE%E9%BE%99%E5%A8%B1%E4%B9%90%E5%AE%A2%E6%9C%8D-19869481847&type=allLobby&_ch=
https://www.ixigua.com/search/%E8%80%81%E8%A1%97%E8%85%BE%E9%BE%99%E5%A8%B1%E4%B9%90%E5%AE%A2%E6%9C%8D-19869481847/?logTag=594535e3690f17a88cdb&tab_name=search
https://www.migu.cn/search.html?content=%E8%80%81%E8%A1%97%E8%85%BE%E9%BE%99%E5%A8%B1%E4%B9%90%E5%AE%A2%E6%9C%8D%E7%94%B5%E8%AF%9D-19869481847&type=allLobby&_ch=
https://www.ixigua.com/search/%E8%80%81%E8%A1%97%E8%85%BE%E9%BE%99%E5%A8%B1%E4%B9%90%E6%B3%A8%E5%86%8C%E7%BD%91%E5%9D%80-19869481847/?logTag=594535e3690f17a88cdb&tab_name=search
http://www.hnxxrsj.gov.cn/Error.aspx?msg=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E6%B8%B8%E6%88%8F%E9%93%BE%E6%8E%A5-19869481847
http://www.hnxxrsj.gov.cn/Error.aspx?msg=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E6%B3%A8%E5%86%8C%E5%AE%98%E7%BD%91-19869481847
http://www.hnxxrsj.gov.cn/Error.aspx?msg=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E6%80%8E%E4%B9%88%E8%81%94%E7%B3%BB-19869481847
http://www.hnxxrsj.gov.cn/Error.aspx?msg=%E5%8D%8E%E7%BA%B3%E5%85%AC%E5%8F%B8%E6%80%8E%E4%B9%88%E8%81%94%E7%B3%BB-19869481847
https://so.youku.com/search_video/q_%E8%80%81%E8%A1%97%E6%96%B0%E7%99%BE%E8%83%9C%E5%A8%B1%E4%B9%90%E6%80%8E%E4%B9%88%E8%81%94%E7%B3%BB-19869481847?searchfrom=1
https://www.migu.cn/search.html?content=%E8%80%81%E8%A1%97%E8%85%BE%E9%BE%99%E5%A8%B1%E4%B9%90%E8%81%94%E7%B3%BB%E6%96%B9%E5%BC%8F-19869481847&type=allLobby&_ch=
https://www.migu.cn/search.html?content=%E8%80%81%E8%A1%97%E8%85%BE%E9%BE%99%E5%A8%B1%E4%B9%90%E8%81%94%E7%B3%BB%E6%96%B9%E5%BC%8F-19869481847&type=allLobby&_ch=
https://so.youku.com/search_video/q_%E8%80%81%E8%A1%97%E6%96%B0%E7%99%BE%E8%83%9C%E5%A8%B1%E4%B9%90%E6%B8%B8%E6%88%8F%E9%93%BE%E6%8E%A5-19869481847?searchfrom=1
https://so.youku.com/search_video/q_%E8%80%81%E8%A1%97%E6%96%B0%E7%99%BE%E8%83%9C%E5%A8%B1%E4%B9%90%E6%B8%B8%E6%88%8F%E7%BD%91%E5%9D%80-19869481847?searchfrom=1
https://www.xinpianchang.com/search?kw=%E8%80%81%E8%A1%97%E6%96%B0%E7%99%BE%E8%83%9C%E5%A8%B1%E4%B9%90%E6%B3%A8%E5%86%8C%E5%AE%98%E7%BD%91-19869481847
https://www.migu.cn/search.html?content=%E8%80%81%E8%A1%97%E6%96%B0%E7%99%BE%E8%83%9C%E5%A8%B1%E4%B9%90%E6%B8%B8%E6%88%8F%E9%93%BE%E6%8E%A5-19869481847&type=allLobby&_ch=
https://www.migu.cn/search.html?content=%E8%80%81%E8%A1%97%E6%96%B0%E7%99%BE%E8%83%9C%E5%A8%B1%E4%B9%90%E6%B3%A8%E5%86%8C%E5%AE%98%E7%BD%91-19869481847&type=allLobby&_ch=
https://www.xinpianchang.com/search?kw=%E8%80%81%E8%A1%97%E6%96%B0%E7%99%BE%E8%83%9C%E5%A8%B1%E4%B9%90%E4%B8%8A%E4%B8%8B%E5%88%86-19869481847
https://so.youku.com/search_video/q_%E8%80%81%E8%A1%97%E6%96%B0%E7%99%BE%E8%83%9C%E5%A8%B1%E4%B9%90%E6%B8%B8%E6%88%8F%E7%BD%91%E5%9D%80-19869481847?searchfrom=1
https://www.xinpianchang.com/search?kw=%E8%80%81%E8%A1%97%E6%96%B0%E7%99%BE%E8%83%9C%E5%A8%B1%E4%B9%90%E4%B8%8A%E4%B8%8B%E5%88%86-19869481847
https://so.youku.com/search_video/q_%E8%80%81%E8%A1%97%E6%96%B0%E7%99%BE%E8%83%9C%E5%A8%B1%E4%B9%90%E5%AE%A2%E6%9C%8D%E7%94%B5%E8%AF%9D-19869481847?searchfrom=1
https://so.youku.com/search_video/q_%E8%80%81%E8%A1%97%E6%96%B0%E7%99%BE%E8%83%9C%E5%A8%B1%E4%B9%90%E5%AE%A2%E6%9C%8D-19869481847?searchfrom=1
https://search.jd.com/Search?keyword=%E8%80%81%E8%A1%97%E6%96%B0%E7%99%BE%E8%83%9C%E5%A8%B1%E4%B9%90%E6%B3%A8%E5%86%8C%E7%BD%91%E5%9D%80-19869481847&enc=utf-8&pvid=5512fd7b531e458abf0a7cd60bf38f31
https://www.xinpianchang.com/search?kw=%E8%80%81%E8%A1%97%E6%96%B0%E7%99%BE%E8%83%9C%E5%A8%B1%E4%B9%90%E8%81%94%E7%B3%BB%E6%96%B9%E5%BC%8F-19869481847
https://www.xinpianchang.com/search?kw=%E8%80%81%E8%A1%97%E6%96%B0%E7%99%BE%E8%83%9C%E5%A8%B1%E4%B9%90%E6%B3%A8%E5%86%8C%E7%BD%91%E5%9D%80-19869481847
https://www.xinpianchang.com/search?kw=%E8%80%81%E8%A1%97%E6%96%B0%E7%99%BE%E8%83%9C%E5%A8%B1%E4%B9%90%E8%81%94%E7%B3%BB%E6%96%B9%E5%BC%8F-19869481847
https://search.jd.com/Search?keyword=%E8%80%81%E8%A1%97%E6%96%B0%E7%99%BE%E8%83%9C%E5%A8%B1%E4%B9%90%E5%AE%A2%E6%9C%8D-19869481847&enc=utf-8&pvid=5512fd7b531e458abf0a7cd60bf38f31
https://search.jd.com/Search?keyword=%E6%AC%A7%E4%BA%9A%E5%9B%BD%E9%99%85%E6%B8%B8%E6%88%8F%E4%B8%8B%E8%BD%BD%E9%93%BE%E6%8E%A5-19869481847&enc=utf-8&pvid=5512fd7b531e458abf0a7cd60bf38f31
https://search.jd.com/Search?keyword=%E6%AC%A7%E4%BA%9A%E5%9B%BD%E9%99%85%E6%B3%A8%E5%86%8C%E7%BD%91%E5%9D%80-19869481847&enc=utf-8&pvid=5512fd7b531e458abf0a7cd60bf38f31
https://search.jd.com/Search?keyword=%E8%80%81%E8%A1%97%E6%96%B0%E7%99%BE%E8%83%9C%E5%A8%B1%E4%B9%90%E5%AE%A2%E6%9C%8D%E7%94%B5%E8%AF%9D-19869481847&enc=utf-8&pvid=5512fd7b531e458abf0a7cd60bf38f31
http://www.hnxxrsj.gov.cn/Error.aspx?msg=%E9%94%A6%E6%B5%B7%E5%9B%BD%E9%99%85%E6%B8%B8%E6%88%8F%E7%BD%91%E5%9D%80-19869481847
http://www.hnxxrsj.gov.cn/Error.aspx?msg=%E6%9E%9C%E5%8D%9A%E4%B8%9C%E6%96%B9%E5%A8%B1%E4%B9%90%E6%B8%B8%E6%88%8F%E9%93%BE%E6%8E%A5-19869481847
www.iyiou.com/search?p=%E6%AC%A7%E4%BA%9A%E5%9B%BD%E9%99%85app%E4%B8%8B%E8%BD%BD-19869481847
http://www.hnxxrsj.gov.cn/Error.aspx?msg=%E9%94%A6%E6%B5%B7%E5%9B%BD%E9%99%85%E6%B3%A8%E5%86%8C%E5%AE%98%E7%BD%91-19869481847
www.iyiou.com/search?p=%E6%AC%A7%E4%BA%9A%E5%9B%BD%E9%99%85%E8%B4%9F%E8%B4%A3%E4%BA%BA-19869481847
www.huoxing24.com/search/%E6%AC%A7%E4%BA%9A%E5%9B%BD%E9%99%85app%E4%B8%8B%E8%BD%BD-19869481847
www.huoxing24.com/search/%E6%AC%A7%E4%BA%9A%E5%9B%BD%E9%99%85%E8%B4%9F%E8%B4%A3%E4%BA%BA-19869481847
https://www.douban.com/search?q=%E6%AC%A7%E4%BA%9A%E5%9B%BD%E9%99%85%E7%BB%8F%E7%90%86-19869481847
https://www.douban.com/search?q=%E6%AC%A7%E4%BA%9A%E5%9B%BD%E9%99%85%E7%BB%8F%E7%90%86-19869481847
https://search.jd.com/Search?keyword=%E6%AC%A7%E4%BA%9A%E5%9B%BD%E9%99%85%E5%AE%98%E7%BD%91-19869481847&enc=utf-8&pvid=5512fd7b531e458abf0a7cd60bf38f31
https://www.ixigua.com/search/%E6%AC%A7%E4%BA%9A%E5%9B%BD%E9%99%85%E4%B8%8A%E4%B8%8B%E5%88%86-19869481847/?logTag=594535e3690f17a88cdb&tab_name=search
https://www.ixigua.com/search/%E6%AC%A7%E4%BA%9A%E5%9B%BD%E9%99%85%E4%B8%8A%E4%B8%8B%E5%88%86-19869481847/?logTag=594535e3690f17a88cdb&tab_name=search
https://www.migu.cn/search.html?content=%E6%AC%A7%E4%BA%9A%E5%9B%BD%E9%99%85%E4%BC%9A%E5%91%98%E6%B3%A8%E5%86%8C-19869481847&type=allLobby&_ch=
https://so.youku.com/search_video/q_%E6%AC%A7%E4%BA%9A%E5%9B%BD%E9%99%85%E4%BC%9A%E5%91%98%E6%B3%A8%E5%86%8C-19869481847?searchfrom=1
https://www.migu.cn/search.html?content=%E6%AC%A7%E4%BA%9A%E5%9B%BD%E9%99%85%E7%BD%91%E7%AB%99-19869481847&type=allLobby&_ch=
https://www.xinpianchang.com/search?kw=%E7%8E%AF%E7%90%83%E5%9B%BD%E9%99%85%E5%AE%A2%E6%9C%8D-19869481847
https://so.youku.com/search_video/q_%E7%8E%AF%E7%90%83%E5%9B%BD%E9%99%85%E5%AE%A2%E6%9C%8D-19869481847?searchfrom=1
https://www.xinpianchang.com/search?kw=%E7%8E%AF%E7%90%83%E5%9B%BD%E9%99%85%E6%B8%B8%E6%88%8F%E4%B8%8B%E8%BD%BD%E9%93%BE%E6%8E%A5-19869481847
https://search.jd.com/Search?keyword=%E7%8E%AF%E7%90%83%E5%9B%BD%E9%99%85%E6%B8%B8%E6%88%8F%E4%B8%8B%E8%BD%BD%E9%93%BE%E6%8E%A5-19869481847&enc=utf-8&pvid=5512fd7b531e458abf0a7cd60bf38f31
https://search.jd.com/Search?keyword=%E7%8E%AF%E7%90%83%E5%9B%BD%E9%99%85%E5%AE%98%E7%BD%91-19869481847&enc=utf-8&pvid=5512fd7b531e458abf0a7cd60bf38f31
http://www.hnxxrsj.gov.cn/Error.aspx?msg=%E6%AC%A7%E4%BA%9A%E5%9B%BD%E9%99%85%E6%B3%A8%E5%86%8C%E5%AE%98%E7%BD%91-19869481847
http://www.hnxxrsj.gov.cn/Error.aspx?msg=%E6%B0%B8%E9%91%AB%E5%A8%B1%E4%B9%90%E5%AE%A2%E6%9C%8D-19869481847
http://www.hnxxrsj.gov.cn/Error.aspx?msg=%E6%B0%B8%E9%91%AB%E5%A8%B1%E4%B9%90%E8%81%94%E7%B3%BB%E6%96%B9%E5%BC%8F-19869481847
http://www.hnxxrsj.gov.cn/Error.aspx?msg=%E6%AC%A7%E4%BA%9A%E5%9B%BD%E9%99%85%E6%B8%B8%E6%88%8F%E9%93%BE%E6%8E%A5-19869481847
http://www.hnxxrsj.gov.cn/Error.aspx?msg=%E6%AC%A7%E4%BA%9A%E5%9B%BD%E9%99%85%E6%B8%B8%E6%88%8F%E9%93%BE%E6%8E%A5-19869481847
http://www.hnxxrsj.gov.cn/Error.aspx?msg=%E6%AC%A7%E4%BA%9A%E5%9B%BD%E9%99%85%E6%B8%B8%E6%88%8F%E7%BD%91%E5%9D%80-19869481847
http://www.hnxxrsj.gov.cn/Error.aspx?msg=%E6%AC%A7%E4%BA%9A%E5%9B%BD%E9%99%85%E4%B8%8A%E4%B8%8B%E5%88%86-19869481847
http://www.hnxxrsj.gov.cn/Error.aspx?msg=%E6%AC%A7%E4%BA%9A%E5%9B%BD%E9%99%85%E5%AE%A2%E6%9C%8D-19869481847
http://www.hnxxrsj.gov.cn/Error.aspx?msg=%E6%AC%A7%E4%BA%9A%E5%9B%BD%E9%99%85%E8%81%94%E7%B3%BB%E6%96%B9%E5%BC%8F-19869481847
http://www.hnxxrsj.gov.cn/Error.aspx?msg=%E6%AC%A7%E4%BA%9A%E5%9B%BD%E9%99%85%E6%B3%A8%E5%86%8C%E7%BD%91%E5%9D%80-19869481847
http://www.hnxxrsj.gov.cn/Error.aspx?msg=%E8%80%81%E8%A1%97%E6%96%B0%E7%99%BE%E8%83%9C%E5%85%AC%E5%8F%B8%E6%80%8E%E4%B9%88%E8%81%94%E7%B3%BB-19869481847
http://www.hnxxrsj.gov.cn/Error.aspx?msg=%E8%80%81%E8%A1%97%E6%96%B0%E7%99%BE%E8%83%9C%E5%85%AC%E5%8F%B8%E6%B8%B8%E6%88%8F%E9%93%BE%E6%8E%A5-19869481847
http://www.hnxxrsj.gov.cn/Error.aspx?msg=%E8%80%81%E8%A1%97%E6%96%B0%E7%99%BE%E8%83%9C%E5%85%AC%E5%8F%B8%E5%AE%A2%E6%9C%8D-19869481847
www.iyiou.com/search?p=%E7%8E%AF%E7%90%83%E5%9B%BD%E9%99%85%E6%80%8E%E4%B9%88%E8%81%94%E7%B3%BB-19869481847
www.huoxing24.com/search/%E7%8E%AF%E7%90%83%E5%9B%BD%E9%99%85%E6%80%8E%E4%B9%88%E8%81%94%E7%B3%BB-19869481847
https://www.douban.com/search?q=%E7%8E%AF%E7%90%83%E5%9B%BD%E9%99%85%E8%81%94%E7%B3%BB%E6%96%B9%E5%BC%8F-19869481847
https://www.ixigua.com/search/%E7%8E%AF%E7%90%83%E5%9B%BD%E9%99%85%E8%81%94%E7%B3%BB%E6%96%B9%E5%BC%8F-19869481847/?logTag=594535e3690f17a88cdb&tab_name=search
https://www.migu.cn/search.html?content=%E7%8E%AF%E7%90%83%E5%9B%BD%E9%99%85%E7%BB%8F%E7%90%86-19869481847&type=allLobby&_ch=
https://so.youku.com/search_video/q_%E6%B0%B8%E9%91%AB%E5%A8%B1%E4%B9%90%E5%AE%A2%E6%9C%8D-19869481847?searchfrom=1
http://www.hnxxrsj.gov.cn/Error.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值