一、springcloud简介
1.0 什么是微服务?
① 业务角度
从业务角度分析,就是将整体项目(传统的一站式应用)按照业务拆分,将每个业务拆分为一个个独立的服务,彻底解除业务模块之间的耦合,每个微服务单独提供单个业务功能,一个服务只做一件事。
② 技术角度
就是一种小而独立的处理过程,类似进程的概念,能够自行单独启动或销毁,可以拥有自己独立的数据库。
③ 微服务优缺点
优点:
1.每个服务足够内聚,足够小,代码容易理解。这样能聚焦一个业务功能或业务需求。
2.开发简单、开发效率提高,一个服务可能就是专业的只干一件事,微服务能够被小团队单独开发,这个小团队可以是2到5人的开发人员组成。
3.微服务是松耦合的,是有功能意义的服务,无论是在开发阶段或部署阶段都是独立的。
4.微服务能使用不同的语言开发。
5.易于和第三方集成,微服务运行容易且灵活的方式集成自动部署。
6.微服务易于被一个开发人员理解、修改和维护,这样小团队能够更关注自己的工作成果,无需通过合作才能体现价值。
7.微服务允许你利用融合最新技术。微服务只是业务逻辑的代码,不会和HTML/CSS或其他界面组件混合,即前后端分离。
8.每个微服务都有自己的存储能力,可以有自己的数据库,也可以有统一数据库。
缺点:
开发人员要处理分布式系统的复杂性。
④ 服务演变
微服务架构是在SOA架构基础上演变而来的,粒度上比soa架构更加精细,微服务架构更加体现”专人干专事”,目的是提高开发效率。每个服务之间互不影响(原子性),每个服务都必须独立部署(独立mysql、redis、消息队列等)。服务之间通过rest风格进行通信(即使用HTTP协议+json格式进行数据的传输)。
⑤ 微服务和SOA服务区别?
(1)微服务架构基于SOA架构演变过来,继承SOA架构的优点,在微服务架构中去除SOA架构中的ESB消息总线,采用http+json(restful)进行传输。
(2)、微服务架构对比SOA架构粒度会更加精细,让专业的人干专业的事情,目的是为了提高效率,每个服务于服务之间互不影响。在微服务架构中,每个服务必须独立部署,微服务架构更加轻巧、轻量。
(3)、SOA架构中可能数据库存储会发生共享,微服务强调每个服务都有独立数据库,保证每个服务于服务之间互不影响。
(4)、项目体现特征,微服务架构比SOA架构更加适合于互联网公司的敏捷开发、快速迭代版本。
1.1 什么是springcloud?
Springcloud是一系列框架的有序集合,它是由spring框架组合的,内部的框架都是各家公司开发的比较成熟、经得起实际考验的服务框架,它通过 Spring Boot风格进行再封装、屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具集。
1.2 Springcloud设计目的?
基于springboot框架,给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
1.3 Springcloud核心组件?
Springcloud是一系列框架的有序集合,内部封装了很多实用性的框架,其中使用最多的是下面5个框架,也称为springcloud的五大神兽。
服务发现框架——Netflix Eureka
客服端负载均衡——Netflix Ribbon
断路器——Netflix Hystrix
服务网关——Netflix Zuul
分布式配置——Spring Cloud Config
二、springcloud五大神兽之Eureka介绍
2.1 Eureka
① Eureka是什么?
Eureka是springcloud中的服务发现框架(服务注册中心),在前后端分离框架中,服务层被拆分成多个微服务,这些微服务之间的通信信息和依赖也需要组件来管理,而eureka可以帮助我们来维护各微服务之间的关系。
② 为什么需要Eureka?
(1)实际项目研发中,微服务数量众多,各微服务之间的通信需要进行远程调用,那么调用过程中就需要明确这些微服务各自的ip地址和端口号,而注册中心Eureka可以帮助我们管理这些个微服务的ip和端口。
(2)使用Eureka管理微服务,微服务会实时上报自身的状态到Eureka注册中心,eureka统一管理这些微服务的状态,比如:将存在问题的服务剔出服务列表,保证各个微服务调用到的服务都是可用的。
③ Eureka做了哪些工作?
(1)服务管理
(2)服务状态监管
(3)服务的注册和发现(Eureka自动匹配服务给调用者)
(4)动态路由
④ Eureka组成
(1)Eureka注册中心(EurekaServer)
(2)服务提供者(向Eureka服务注册中心注册服务)
(3)服务消费者(向Eureka服务注册中心订阅服务)
⑤ 三者关系

(1)不管是服务提供者还是服务消费者,对于Eureka注册中心来讲,都是客户端
(2)注册中心(也可以是集群)对外暴露自己的地址(ip+端口)
(3)服务提供者向Eureka服务注册中心注册自己的服务信息
(4)服务消费者从Eureka订阅服务,Eureka注册中心会自动将对应服务的所有提供者地址列表发送给消费者,服务消费者会将服务列表缓存到本地,并定期更新。
2.2 Eureka案例演示
① 创建Eureka服务注册中心工程
(1)使用maven创建eureka-server工程,该工程作为服务注册中心工程
(2)在pom.xml文件中导入eureka的依赖坐标

<dependencies><!--eureka-server依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>
</dependencies>

(3)在resource目录下,创建application.yml文件,并加入相关配置

server:port: 7001  #指定注册中心端口号
spring:application:name: eureka-server #引用名称,在Eureka中作为服务的id标识(serviceId),注意:该名称中不可以使用下划线
eureka:client:register-with-eureka: false #是否将自己注册到Eureka注册中心中,false表示关闭掉fetch-registry: false #是否从eureka注册中心中获取服务,false表示关闭掉service-url:defaultZone: http://127.0.0.1:7001/eureka  # 指定EurekaServer服务端的地址(对外暴露的ip+端口)

(4)创建该工程的启动类

@SpringBootApplication
@EnableEurekaServer //开启eureka服务,注册中心只能是Eureka
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class,args);}
}
//在该启动类上加上@EnableEurekaServer注解,标注当前工程作为Eureka的服务注册中心,启动类运行后,该工程开启eureka服务,服务提供者就可以注册服务,消费者就可以订阅相关服务

② 创建Eureka服务提供者工程
(1)使用maven创建服务提供者服务(user_producer)
(2)在pom.xml文件中导入eureka客户端依赖坐标

<!--加入eureka客户端依赖-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

(3)在resouce下创建application.yml文件,并指定注册中心地址

#配置eureka服务地址
eureka:client:service-url:defaultZone: http://localhost:7001/eureka

(4)创建该工程的启动类

@SpringBootApplication
@EnableDiscoveryClient //开启Eureka客户端,注册中心可以其它框架
public class UserProducerSpringBootApplication {public static void main(String[] args) {SpringApplication.run(UserProducerSpringBootApplication.class,args);}
}
//在该启动类上加上@EnableDiscoveryClient,表示开启Eureka客户端,也标注当前工程为服务提供者工程,对于eureka-server工程来说也是一个客户端(提供服务的客户端)

③ 创建Eureka服务消费者工程
(1)使用maven创建服务消费者工程(user_consumer)
(2)在pom.xml文件中导入eureka客户端依赖坐标

<!--eureka客户端-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

(3)在resouce目录下创建application.yml文件,并加入相关配置

#指定eureka服务地址
eureka:client:service-url:defaultZone: http://127.0.0.1:7001/eureka

(4)创建启动类

@SpringBootApplication
@EnableDiscoveryClient
//@EnableCircuitBreaker   //开启熔断
//@EnableFeignClients(basePackages = {"com.swk.feign"})
public class UserConsumerSpringBootApplication {public static void main(String[] args) {SpringApplication.run(UserConsumerSpringBootApplication.class,args);}@Bean//@LoadBalanced   //开启ribbon负载均衡,默认是轮询public RestTemplate restTemplate(){return new RestTemplate();}
}//在该启动类上加上@EnableDiscoveryClient,表示开启Eureka客户端,也标注当前工程为服务消费者工程,对于eureka-server工程来说也是一个客户端(消费服务的客户端)。
//使用RestTemplate类(Rest的HTTP客户端模板工具类)发送请求,需要先将restTemplate对象注入到spring容器中

④ 测试
(1)分别启动注册中心工程、服务提供者工程、服务消费者工程,发送请求访问各自的服务
注册中心:

访问服务提供者:
服务消费者:

(2)思考:消费方在使用RestTemplate类发请求时存在的问题?
在服务消费者中,我们把url地址硬编码到代码中,不方便后期维护
在服务消费者中,不清楚服务提供者的状态(user-provider有可能宕机)
服务提供者只有一个服务,即便服务提供者形成集群,服务消费者还需要自己实现负载均衡
服务提供者的如果出现故障,是否能够及时发现
⑤ 解决url硬编码问题
(1)在服务消费方的UserController中注入DiscoveryClient对象

@RequestMapping("/consumer")
@RestController
public class UserController {@Autowired
RestTemplate restTemplate;
@Autowired
DiscoveryClient discoveryClient;
@GetMapping(value = "/{id}")
public User queryById(@PathVariable("id") Integer id){/* String url = "http://localhost:8081/user/find/" + id ;return restTemplate.getForObject(url,User.class);*///基于DiscoveryClient对象来访问
//获取指定服务名称的实例List<ServiceInstance> userProducer = discoveryClient.getInstances("user-producer");
//获取第一个实例ServiceInstance serviceInstance = userProducer.get(0);
//拼接提供者服务地址,更加灵活String url = "http://" + serviceInstance.getHost()+":"+serviceInstance.getPort() + "/user/find/" + id;return restTemplate.getForObject(url,User.class);//基于服务名称来访问/*String url = "http://user-producer/user/find/"+id;return restTemplate.getForObject(url,User.class);*/
}
}
//DiscoveryClient 对象是由springcloud框架提供的,用于发现(获取)当前注册中心中的服务对象,注册中心可能是集群,所以返回的是一个集合
//将DiscoveryClient 对象注入到当前UserController中,根据服务名称获取

⑥ 使用IP访问配置
在服务提供方的application.yml文件中加入instance相关配置

#配置eureka服务地址
eureka:client:service-url:defaultZone: http://localhost:7001/eureka#每隔30s获取服务中心列表一次(只读备份)#registry-fetch-interval-seconds: 30instance:#指定ip地址访问ip-address: 127.0.0.1#访问服务时,推荐使用ipprefer-ip-address: true


⑦ 客户端~服务续约
服务续约是服务提供者的操作;
前面我们说对于EurekaServer注册中心来说,服务提供者和服务消费者都是客户端。
(1)对于EurekaClient(客户端)来说,它会每隔30秒发送一次心跳给EurekaServer注册中心来完成续约。通过续约来告知 EurekaServer 注册中心该 Eureka Client 运行正常,没有出现问题。
(2)默认情况下,如果 Eureka Server 在 90 秒内没有收到 Eureka Client 的续约(续约到期),EurekaServer注册中心端会将该服务的实例从其注册表中删除,此时间可配置,一般情况不建议更改。
服务续约配置:

instance:#指定ip地址访问ip-address: 127.0.0.1#访问服务时,推荐使用ipprefer-ip-address: true#租约到期,服务有效时间,默认值90slease-expiration-duration-in-seconds: 90#租约续约间隔时间,默认30slease-renewal-interval-in-seconds: 30

⑧ 客户端~获取服务
获取服务是服务消费者的基础;
(1)服务消费者EurekaClient在调用服务时,会先从EurekaServer注册中心获取服务注册表信息,如果EurekaClient没有缓存服务注册表信息,会从EurekaServer获取最新的服务注册表(读取备份),并将其缓存在本地。消费方使用获取到的信息查找对应的服务,然后进行远程服务调用。
(2)默认情况下EurekaClient 使用压缩JSON格式来获取服务注册列表的信息。
(3)EurekaClient每隔30秒重新获取一次EurekaServer注册中心中的服务列表信息,如果30秒后获取到的服务列表信息和之前的不一致,服务消费方自动处理(重新获取服务注册表(备份)并缓存到本地)。

#配置eureka服务地址
eureka:client:service-url:defaultZone: http://localhost:7001/eureka#每隔30s获取服务中心列表一次(只读备份)registry-fetch-interval-seconds: 30

⑨ 失效剔除和自我保护
当 Eureka Client 和 Eureka Server 不再有心跳时,Eureka Server 会将该服务实例从服务注册列表中删除,即服务剔除。
(1)服务下线
当服务正常关闭操作时,会发送服务下线的REST请求给EurekaServer。
服务中心接受到请求后,将该服务置为下线状态
(2)失效剔除
服务中心每隔一段时间(默认60秒)将清单中没有续约的服务剔除。
通过eviction-interval-timer-in-ms配置可以对其进行修改,单位是毫秒

eureka:client:register-with-eureka: false #是否将自己注册到Eureka中,false表示关闭掉fetch-registry: false #是否从eureka中获取服务,false表示关闭掉service-url:defaultZone: http://127.0.0.1:7001/eureka  # EurekaServer服务端的地址#server:#失效服务剔除,默认60s(毫秒为单位)eviction-interval-timer-in-ms: 6000

(3)自我保护机制
默认情况下,如果 Eureka Server 在90s内没有接收到某个微服务实例的心跳,会注销该实例。但是在微服务架构下服务之间通常都是跨进程调用,网络通信往往会面临着各种问题,比如微服务状态正常,网络分区故障,导致此实例被注销。
Eureka 自我保护机制是为了防止误杀服务而提供的一个机制。
固定时间内大量实例被注销,可能会严重威胁整个微服务架构的可用性。为了解决这个问题,Eureka 开发了自我保护机制,那么什么是自我保护机制呢?
EurekaServer在运行期间会去统计心跳失败比例,在15分钟之内是否低于85%,如果低于 85%,EurekaServer即会进入自我保护机制。
服务中心页面会显示如下提示信息:

Eureka Server 进入自我保护机制,会出现以下几种情况:
(1)Eureka 不再从注册列表中移除因为长时间没收到心跳而应该过期的服务
(2)Eureka 仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上(即保证当前节点依然可用)
(3)当网络稳定时,当前实例新的注册信息会被同步到其它节点中

springcloud五大神兽之Eureka介绍相关推荐

  1. SpringCloud五大神兽之Eureka服务注册(三)——Eureka的自我保护

    一.ACID与CAP 传统ACID: A:atomicity   原子性 C:consistency    一致性 I:isolation    独立性 D:durability    持久性 目前流 ...

  2. 一、SpringCloud五大神兽之Eureka(eurekaServer集群)

    基本概念和方案 Eureka是基于REST(Representational State Transfer,代表性状态传输)的服务,主要用于AWS云中定位服务,以实现中间层服务器的负载平衡和故障转移. ...

  3. SpringCloud五大神兽之Eureka服务注册(一)

    一.什么是Eureka? 官方翻译:Eureka是一个基于Rest的服务,用于定位服务,以实现云端中间层服务发现和故障转移.即--Eureka主管服务的注册与发现. 在微服务架构中,只需要使用服务的标 ...

  4. java四神兽_SpringCloud五大神兽之Eureka

    注册中心概述 什么是注册中心? 相当于服务之间的'通讯录',记录了服务和服务地址之间的映射关系.在分布式架构中服务会注册到这里.当服务需要调用其他服务时,就在注册中心找到其他服务的地址,进行调用 注册 ...

  5. java复习笔记4--SpringCloud系列二:五大神兽之Eureka

    前面两天介绍了SpringCloud的基础知识,以及窥探了一下加载流程,整个代码还是很长并且晦涩的,一定要多debug去跟进,看每个对象何时创建和赋值,一步步跟着走,这样才能对整个流程有一个很好的了解 ...

  6. java cloud五大神兽_SpringCloud五大神兽之Eureka

    注册中心概述 什么是注册中心? 相当于服务之间的'通讯录',记录了服务和服务地址之间的映射关系.在分布式架构中服务会注册到这里.当服务需要调用其他服务时,就在注册中心找到其他服务的地址,进行调用 注册 ...

  7. SpringCloud五大神兽快速入门

    Spring Cloud 单一应用架构 :主要解决ORM 数据库访问层. 垂直应用架构 : 解决分层问题,实现应用的分层开发,提升开发效率. 分布式应用架构:解决系统间调用问题,引发了SOA(面向服务 ...

  8. springcloud五大神兽及其原理

    一.使用eureka做注册中心 个人版本的初级springcloud总体结构 一.使用eureka做注册中心 总体说明: 会员和订单都以服务的形式存在(即只有接口,没有页面的那种工程),springc ...

  9. springCloud五大神兽(思维导图)

    SpringCloud的五大件 思维导图 服务发现--Netflix Eureka 客服端负载均衡--Netflix Ribbon 断路器--Netflix Hystrix 服务网关--Netflix ...

最新文章

  1. Asp.Net Core写个共享磁盘文件Web查看器
  2. java中利用框架传入相同的url实现crud操作_还在手写CRUD代码?这款开源框架助你解放双手!
  3. python之Argparse模块
  4. boost::python::bases相关的测试程序
  5. VTK:Filtering之ImplicitBoolean
  6. MYSQL编写过程和解析过程的差异
  7. echarts 弹出放大_Echarts图标增加全屏/放大功能
  8. reactjs快速如梦_帮助您理解和创建ReactJS应用的快速指南
  9. A20(emmc) 编译环境
  10. Wallpaper:基于Typecho的壁纸头像站主题
  11. 【UI设计师必备】可临摹精美的APP UI Kit模板
  12. mysql dump 锁表_运行MySQLDump而不锁定表
  13. m3u8 video ios h5_移动端H5页面踩坑记
  14. SAP BAPI_SALESORDER_CREATEFROMDAT2 创建销售订单
  15. python真好玩 pdf 下载_Python真好玩:教孩子学编程_PDF电子书
  16. 错误解决:java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to star
  17. macOS Mojave patcher 无法制作启动盘
  18. vot toolkit的超详细使用(多图)
  19. 树莓派安装Ubuntu server无屏幕开机自动连接WIFI
  20. docker volume用法

热门文章

  1. 2020-06-08
  2. C++常用字符串长度计算函数
  3. 实践是检验真理的唯一标准!!LoopBack 设置案例!
  4. ArcGIS生成矢量的分层设色地形图
  5. 数据库中如何备份数据
  6. Unity-面向接口编程(IOP)
  7. linux shell awk用法
  8. MySQL中事务的持久性实现原理
  9. 沙拉划词+福昕 文献翻译
  10. Linux下基本指令