springboot和eureka总结

springboot和eureka总结

---------------------------eureka回顾------------------------------

、eureka源码

​ spring-cloud-netflix-eureka-server-2.1.2.RELEASE.jar
​ InstanceRegistry.class:
​ register()
​ ConcurrentHashMap<String, Map<String, Lease>> registry

zookeeper和eureka区别?

​ zookeeper:zookeeper的写操作由leader负载,分区部署时失去leader概率很大,这时就要重新选举且时长是30~120s。(cp)
​ eureka:各个节点都是平等的,几个节点挂掉都不影响正常工作,但是不保证每个节点数据都一样(ap)

、自我保护

​ 1、自我保护是针对网络波动的保护措施
​ 1、收到的心跳低于85%:不从服务列表中删除服务(网络故障)
​ 2、收到的心跳不低于85%:删除没有发送心跳的服务(单点故障)
​ 2、阀值公式:
​ Renew threshold:(n2)0.85
​ Renew (last min):n*2

、自我保护的好处?
	a、不会删除因为网络故障而收不到心跳的服务
	b、微服务的负载均衡策略会剔除死亡的服务

什么是SpringCloud

开发微服务的一个技术 轻量级微服务治理方案

为什么用 因为 项目:高并发 大流量 业务复杂 模块多 使用量大 微服务

系统架构的发展史 单体应用--分布式(公共代码复用性差)--SOA(esb)--微服务

springCloud用在 微服务场景/分布式

怎么用 他提供了一套进行微服务开发的组件 继承Netflix公司产品

Eureka 注册中心 zookeeper nacos (注册中心)

工作原理

​ 注册中心 Eureka-server

​ 服务提供者

​ 服务调用者 消费者

了解

后天服务调用的接口 spring resTemplate

service 技术 doboo/RPC/Rml

controller 技术 spring restemplate/httpClient/UrlConnection/rabbion/feign

soap 技术 webservice

前台调用后台接口 controller http协议 restful

restful 是一套规范 一套约束

get:查询

post:添加

delete:删除

put:修改

什么是微服务

微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底地去耦合,每一个服务提供单个业务功能的服务

Spring Cloud版本号

常见版本号说明

软件版本号:**2.0.2.RELEASE

1:主版本号。当功能模块有较大更新或者整体架构发生变化时,主版本号会更新

2:次版本号。次版本表示只是局部的一些变动。

3:修改版本号。一般是 bug 的修复或者是小的变动

RELEASE:希腊字母版本号。次版本号用户标注当前版本的软件处于哪个开发阶段

.希腊字母版本号

Base:设计阶段。只有相应的设计没有具体的功能实现。
Alpha:软件的初级版本。存在较多的 bug
Bate:表示相对 alpha 有了很大的进步,消除了严重的 bug,还存在一些潜在的 bug
PRE: 预览版,内部测试版. 主要是给开发人员和测试人员测试和找BUG用的,不建议使用;
SNAPSHOT: 快照版,可以稳定使用,且仍在继续改进版本
Release:该版本表示最终版
GA:官方推荐使用此版本,在国外都是用GA来说明release版本的,一般同 时标注SR1,表示第1个正式版本。

Spring Cloud版本号说明

采用伦敦的地铁站名称来作为版本号的命名,根据首字母排序,字母顺序靠后的版本号越大。

什么是分布式什么是集群

分布式是指通过网络连接的多个组件,通过交换信息协作而形成的系统。而集群,是指同一种组件的多个实例,形成的逻辑上的整体

Eureka注册中心是什么?

Eureka是Netflix开发的服务发现组件,本身是一个基于REST的服务。Spring Cloud将它集成在其子项目spring-cloud-netflix中,以实现Spring Cloud的服务注册于发现,同时还提供了负载均衡、故障转移等能力

Eureka三大角色

Ø Eureka Server:注册中心

​ 通过 Register、Get、Renew 等接口提供服务的注册和发现。

Ø Service Provider:服务提供方

​ 把自身的服务实例注册到 Eureka Server 中

Ø Service Consumer:服务调用方

​ 通过 Eureka Server 获取服务列表,消费服务。

列注册中心

注册

pom.xml

<?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">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
    </parent>

    <groupId>com.usian</groupId>
    <artifactId>springcloud_eureka_server</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <!-- springBoot的启动器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--eureka-server服务端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>
</project>

启动类

package com.jiyun;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer//开启注册中心
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class,args);
    }
}

application。properties中

server.port=8081  //设置端口号否则会冲突


#设置eureka不注册自己
eureka.client.register-with-eureka=false
#设置eureka不获取其他服务的注册信息
eureka.client.fetch-registry=false

提供者

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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.jiyun</groupId>
    <artifactId>day04_Sc</artifactId>
    <version>1.0-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <!-- springBoot的启动器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--eureka-server客户端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>

</project>

启动类

package com.jiyun;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;


@EnableEurekaClient//允许向服务端注册服务
@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class,args);
    }
}

application。properties

server.port=8777//端口号

#向注册中心注册的名字
spring.application.name=eureka-provider

#设置注册中心的地址  8761是注册中心得好
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8761/eureka/

controller

package com.jiyun.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ScController {

    @RequestMapping("sc")
    public  void sc(){
        System.out.println("生产者!!!!!!");
    }
}

消费者

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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.jiyun</groupId>
    <artifactId>day04_Dy</artifactId>
    <version>1.0-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <!-- springBoot的启动器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--eureka-server客户端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

    </dependencies>

</project>

启动类

package com.jiyun;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
//允许向注册中心注册该服务,并可以获取其他服务的调用地址
@EnableEurekaClient//或@EnableDiscoveryClient
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class,args);
    }
    @Bean
    public RestTemplate restTemplate(){
        return  new RestTemplate();
    }
}

application。propertie

server.port=8666
#注册中心挂个名字
spring.application.name=eureka-consumer

#设置服务注册中心地址   8761是注册中心得端口号
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8761/eureka/

controller

package com.jiyun.com.jiyun;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class dyController {
    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    @RequestMapping("get")
    public void get(){
        System.out.println("调用前----------");
        ServiceInstance choose = loadBalancerClient.choose("DAY04_SC8082");

        restTemplate.getForObject("http://"+choose.getHost()+":"+choose.getPort()+"/sc",Void.class);
        System.out.println("调用后----------");
    }
}

集群版的Eureka注册中心

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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.jiyun</groupId>
    <artifactId>day04_Zc2</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <!-- springBoot的启动器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--eureka-server服务端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

</project>

把application。properties改下

server.port=8086
spring.application.name=eureka-server  //规定下名字

8081那个注册中心得端口
eureka.client.service-url.defaultZone=http://127.0.0.1:8081/eureka/

消费者

只改下 application。properties

server.port=8083


spring.application.name=day04_Dy8083
//分别的注册中心端口号
eureka.client.service-url.defaultZone=http://127.0.0.1:8081/eureka/,http://127.0.0.1:8086/eureka/

生产者

只改下 application。properties

server.port=8082


spring.application.name=day04_Sc8082
//分别的注册中心端口号
eureka.client.service-url.defaultZone=http://127.0.0.1:8081/eureka/,http://127.0.0.1:8086/eureka/

Eureka集群原理

Register(服务注册):把自己的 IP 和端口注册给 Eureka。
Renew(服务续约):发送心跳包,每 30 秒发送一次。告诉 Eureka 自己还活着。
Cancel(服务下线):当 provider 关闭时会向 Eureka 发送消息,把自己从服务列表中删除。防止consumer调用到
不存在的服务。
Get Registry(获取服务注册列表):获取服务列表。
Replicate(集群中数据同步):eureka 集群中的数据复制与同步。
Make Remote Call(远程调用):完成服务的远程调用。


# Eureka与Zookeeper的区别

#### CAP原则

分布式系统遵循CAP原则

 CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency (一致性)、Availability (可用性)、Partition tolerance (分区容错性),三者不可兼得。

​      CAP 由 Eric Brewer 在 在 2000 年  PODC会议上提出。该猜想在提出两年后被证明成立,成为我们熟知的 CAP定理
	

一致性和可用性,为什么不可能同时成立?

答案很简单,因为G1和G2可能通信失败(即出现分区容错)。

如果保证 G2 的一致性,那么 G1 必须在写操作时,锁定 G2 的读操作和写操作。只有数据同步后,才能重新开放读写。锁定期间,G2 不能读写,可用性不成立。

如果保证 G2 的可用性,那么势必不能锁定 G2,一致性不成立。

## Eureka比Zookeeper好在哪里?

- zookeeper:zookeeper的写操作由leader负责,分区部署时失去leader概率非常大。leader死了或连不上了,就要重新选举且时间是30~120s(cp),且选举期间整个zk集群是都是不可用的

- eureka:Eureka各个节点都是平等的,几个节点挂掉不影响正常节点的工作,只不过查到的信息可能和其他节点不一样(ap)

# Eureka的自我保护

### 什么是自我保护?

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

保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server将会保护超过 60 秒没有发送心跳服务,不再删除服务注册表中的数据。

1,自我保护的条件

​       微服务在 Eureka 上注册后,会每 30 秒发送心跳包,每分钟 2 个心跳的固定频率因子

​       自我保护模式被激活的条件是:在 1 分钟后,`Renews (last min) < Renews threshold`

2,有两种情况会导致 EurekaServer 收不到微服务的心跳

​       a.微服务的自身的故障关闭:只会导致个别服务出现故障,一般不会出现大面积故障

​       b.网络故障:通常会导致 Eureka Server 在短时间内无法收到大批心跳。考虑到这个原因,Eureka 设置了一

​         个阀值,当判断挂掉的服务的数量超过阀值时,Eureka Server 认为很大程度上出现了网络故障,将不再删

​          除心跳过期的服务。

3,自我保护的机制(阀值)

​       Eureka Server 在运行期间,会统计心跳失败的比例是否低于 `85%`;	

	1、低于85%:不在从注册列表中移除服务(网络故障)
	2、不低于85%:删除超过90秒没有发送心跳的服务(非网络故障)

    心跳阀值的公式:
			Renews threshold:(n*2)*0.85=13
			Renews (last min):n*2=16
	
	实验1:
		1、开启集群版的eureka
		2、注册6个服务到eureka中
		3、校对心跳阀值的公式
				Renews threshold:(4*2)*0.85=6
				Renews (last min):4*2=8
		4、关闭一个服务,等待90秒,观察该服务是否删除

	实验2:
		1、开启集群版的eureka
		2、注册两个服务到eureka中
		3、校对心跳阀值的公式
				Renews threshold:(4*2)*0.85=6
				Renews (last min):4*2=8
		4、关闭一个服务,等待自我保护的开启

7.2.为什么要启动自我保护

1、网络波动时保留“坏数据”(服务端没挂,但收不到心跳),consumer仍然能从eureka中获得provide的调用地址
2、网络恢复后会退出自我保护模式
3、微服务的负载均衡策略会剔除死亡的节点

7.3.如何关闭自我保护

1、修改 Eureka Server 配置文件

#关闭自我保护:会删除收不到心跳的服务
eureka.server.enable-self-preservation=false

2、重新启动服务,然后关闭客户端进行测试:

此时我们发现,红色警告变成了自我保护被关闭的警告,且一分钟后实例被注册中心剔除,表明此时自我保护机制被关闭

8.注册信息完善与actuator

6.1.注册信息完善

修改consumer的application.properties:

#该微服务在eureka上的显示名
eureka.instance.instance-id=${spring.cloud.client.ipaddress}:${spring.application.name}:${server.port}
#访问路径可以使用IP地址
eureka.instance.prefer-ip-address= true

6.2.actuator

修改:

1、添加依赖

        <!-- actuator监控信息完善 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

2、修改application.properties

#info页面展现配置
info.app.name=springcloud-eureka-provider
info.company.name=www.usian.cn
info.build.artifactId=springcloud_eureka_provider
info.build.version=1.0-SNAPSHOT

完善info信息

监控服务的健康状况:

http://192.168.142.1:8771/actuator/health

posted @ 2020-11-10 08:00  脑浆炸裂  阅读(488)  评论(0)    收藏  举报