0
点赞
收藏
分享

微信扫一扫

SpringCloud之服务注册中心(Eureka,Zookeeper,consul)(总体第二篇)

上一篇中复习一些SpringBoot的相关内容,构建了一个项目,接下来学习我们的EureKa进行学习。

一、服务注册与发现

(一)Eureka(这个已经淘汰了)

1、提前概念走起

(1)分析情况

在这里插入图片描述
我们80掉8001,不是一样的吗,都可以的啊,那为什么还要进行服务注册呢?其实这个问题很好答复上来,我们这个很少,只有两个,要是多了就很可怕了。具体可以看后面的一点点的理解,这就是需要服务注册的原因了。

(2)什么是服务治理

在这里插入图片描述
你有千百个服务的话,那他们之间互相调用的。

(3)什么是服务注册

在这里插入图片描述
在这里插入图片描述

(4)Eureka两个组件

在这里插入图片描述

2、Eureka单机实现

在这里插入图片描述

(1)建model

在这里插入图片描述

(2)改pom

<dependencies>
        <!--eureka-server-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
        <dependency>
            <groupId>cn.mldn</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--boot web actuator-->
        <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>
        <!--一般通用配置-->
        <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>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
    </dependencies>

(3)写yml

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/

(4)主启动

在这里插入图片描述

  • 这里需要特殊的一点就是要标记自己是服务注册中心
    在这里插入图片描述

(5)测试启动

在这里插入图片描述

在这里插入图片描述

3、8001入住Eureka

(1)改主启动

在这里插入图片描述

(2)改pom

在这里插入图片描述

(3)改yml

在这里插入图片描述

(4)启动测试

在这里插入图片描述

4、80入住Eureka

(1)改主启动

在这里插入图片描述

(2)改pom

在这里插入图片描述

(3)改yml

在这里插入图片描述

(4)启动测试

在这里插入图片描述

5、Eureka集群原理说明

在这里插入图片描述
首先看情况,如果单机模式的Eureka Server断了,是不是会出现单点故障,那你的应用就没了,那样不好。

(1)介绍

在这里插入图片描述
在这里插入图片描述

  • 不再像之前那种,现在进行对外暴露,相互注册。
    在这里插入图片描述

(2)构建集群环境

  • 建model
    在这里插入图片描述

  • 主启动
    在这里插入图片描述

  • 改pom

<dependencies>
        <!--eureka-server-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
        <dependency>
            <groupId>cn.mldn</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--boot web actuator-->
        <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>
        <!--一般通用配置-->
        <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>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
    </dependencies>
  • 修改映射文件【模拟多态主机】
    在这里插入图片描述

  • 写yml
    在这里插入图片描述
    在这里插入图片描述

  • 启动测试
    在这里插入图片描述
    在这里插入图片描述

(3)将8001入住集群

  • 改yml
    在这里插入图片描述

(4)将80入住集群

  • 同样的修改yml配置
    在这里插入图片描述
  • 启动测试【这里启动是必须遵守的是先启动集成服务的7001,7002,然后再启动其他的】
    在这里插入图片描述
    在这里插入图片描述

(5)支付微服务8001详细配置

Eureka Server是多个,同样的Service Provider也是多个的
在这里插入图片描述

参考8001,新建8002

  • 建model
    在这里插入图片描述
  • 改pom
<dependencies>
        <!--包含了sleuth+zipkin-->
        <!--<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zipkin</artifactId>
        </dependency>-->
        <!--eureka-client-->
        <dependency>
            <groupId>cn.mldn</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <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>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>
        <!--mysql-connector-java-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--jdbc-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </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>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

    </dependencies>

  • 写pom
server:
  port: 8002

eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:7001/eureka,http://localhost:7002/eureka


spring:
  application:
    name: cloud-payment-service
  zipkin:
    base-url: http://localhost:9411
  sleuth:
    sampler:
    #采样率值介于 0 到 1 之间,1 则表示全部采集
    probability: 1
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource            # 当前数据源操作类型
    driver-class-name: com.mysql.cj.jdbc.Driver             # mysql驱动包
    url: jdbc:mysql://localhost:3306/cloud2022?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    username: root
    password: 111

mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: cn.mldn.playmentDemo.entities
  • 主启动
    在这里插入图片描述

  • 其他的就是自己复制了

  • 比如现在我们的支付服务提供了多个,那到底是调用哪个呢?那就可以进行如下的修改
    在这里插入图片描述
    在这里插入图片描述

  • 启动测试
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    虽然是成功了,但是不是真的成了
    在这里插入图片描述
    这里不应该这样写,而且是应该动态的获取
    在这里插入图片描述
    在这里插入图片描述

  • 再次测试

    发现报错,原因就是你现在的请求过,下面有两个,我怎么知道你到底用那个呢,所以还要进行一点配置在这里插入图片描述
    开启负载均衡
    在这里插入图片描述
    再次刷新就可以看到1和2变动
    在这里插入图片描述

6、actuator微服务信息完善

(1)修改主机名称

  • 如下的信息都暴露了不好
    在这里插入图片描述
  • 首先确认已经导入了依赖
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 查询是否健康
    在这里插入图片描述

(2)访问信息有ip信息提示

下面没有显示几号机器,几号端口
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7、服务发现Discovery

  • 说白点就是一个新的注解标签
    在这里插入图片描述

(1)修改8001

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8、Eureka自我保护

(1)概念知识

访问7001和7002都会发现
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 什么是自我保护模式?
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

(2)如果禁止自我保护

  • 默认是开启状态

  • 先改7001和7002
    在这里插入图片描述
    在这里插入图片描述

  • 再改8001和8002
    在这里插入图片描述
    在这里插入图片描述

9、Eureka停更说明

在这里插入图片描述
停更不停用。

(二)Zookeeper

1、SpringCloud整合Zookeeper替代Eureka

  • 首先对我们的Zookeeper有个大概的了解:https://blog.csdn.net/weixin_46635575/article/details/124062769
  • 前提安装好Zookeeper和关闭Linux的防火墙
    在这里插入图片描述
    在这里插入图片描述

2、服务的提供者

(1)建model

在这里插入图片描述

(2)导入pom

<dependencies>
        <!-- SpringBoot整合Web组件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
            <groupId>cn.mldn</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!-- SpringBoot整合zookeeper客户端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
            <!--先排除自带的zookeeper3.5.3-->
            <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>

在这里插入图片描述

(3)建yml

在这里插入图片描述

  • 可以对比一下
    在这里插入图片描述

(4)建主启动类

@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain8004 {

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

只要不用eureka,就可以不用再添加@EnableEurekaClient注解了

(5)编写业务逻辑

在这里插入图片描述
在这里插入图片描述

3、临时还是持续节点呢

  • 临时可以分:临时节点和带符号的临时节点
  • 持续节点可以分:持续节点和带符号的持续节点

那我们到底是什么样子的呢?

  • 我们先停掉8004,在Linux上面查询显示,刚开始有,它持续给你发,没有了它就把你给干掉了
    在这里插入图片描述
  • 当你再次启动后,但是它相当于新的了。【你一定时间内,有就连,否则给你清理干净,什么都不留,不像Eureka】

4、订单服务注册进Zookeeper

(1)建model

在这里插入图片描述

(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>spring-cloud1</artifactId>
        <groupId>cn.mldn</groupId>
        <version>1.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

在这里插入图片描述

(4)主启动

在这里插入图片描述

(5)业务逻辑

  • 配置类
    在这里插入图片描述
  • controller
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

@RestController
@Slf4j
public class zkController {

    public static final String INVOKE_URL = "http://cloud-provider-payment";

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

在这里插入图片描述

  • 如果集群的话,就是在connect-string添加多个。之后如果工作中用再细致的学习。

(三)Consul

1、Consul介绍

consul是一套开源的分布式服务发现和配置管理系统,由HashiCorp公司用go语言开发的。
在这里插入图片描述
在这里插入图片描述

  • 具体下载安装开源去这:https://www.consul.io/downloads

2、安装并且运行

  • 本次选择安装在windows里面【它启动就秒退,不要以为是错误的,其实没什么问题的】
    在这里插入图片描述
  • 运行
    在这里插入图片描述
  • 8500端口访问即可
    在这里插入图片描述

3、服务提供者注册进consul

(1)建项目

在这里插入图片描述

(2)导依赖

 <dependencies>
        <!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
        <dependency>
            <groupId>cn.mldn</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</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>

(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)主启动

在这里插入图片描述

(5)业务逻辑

在这里插入图片描述

(6)启动测试

在这里插入图片描述
在这里插入图片描述

4、注册消费者进consul

(1)建model

在这里插入图片描述

(2)改pom

 <dependencies>
        <!--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>
    </dependencies>
</project>

(3)建yml

在这里插入图片描述

(4)主启动

在这里插入图片描述

(5)业务类

  • 配置类
    在这里插入图片描述
  • controller
    在这里插入图片描述

(6)启动测试

这个就是自己来

(四)三大注册中心对比

(1)看对比

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(2)例子

比如京东和淘宝,在双十一,一定要保证高可用,一致性没有那么重要,数据的一致性有一点小问题,没什么问题。而在另外一些情况下,又要保证是必须数据是一直的,是有一定的关系的。

  • 当AP架构
    在这里插入图片描述
    在这里插入图片描述
    我们的Eureka它是好死不如烂活着。
  • 当采用CP架构
    在这里插入图片描述
    在这里插入图片描述
    像我们的Zookeeper就不会温情,只要死了,就把你干掉了。

(五)Nacos

这个到SpringCloudAlibaba再补充

举报

相关推荐

0 条评论