SpringCloud以及微服务框架

1.Eureka服务治理组件
springcloud中的核心组件,可以实现对整个微服务集群所有节点进行服务的发现,服务的抓取和服务监听功能
1.1服务治理的概念中的三个角色
o 服务注册中心:所有的服务的集中管理角色
o 服务的提供者:服务提供者会将自己的信息打包(ip,port,服务名称等等),注册在注册中被注册中心管理和维护(注册)
o 服务的调用者: 可以通过对注册中心的访问,获取服务提供者的信息,从而进行负载均衡的调用(抓取发现)
1.2入门案例服务注册中心
o 准备一个springboot+springcloud开发环境的工程
• pom:继承springboot-parent

org.springframework.boot
spring-boot-starter-parent
1.5.9.RELEASE

• dependencyManagement:导入springcloud的所有依赖



org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import



• 引入eureka注册中心的依赖

org.springframework.cloud
spring-cloud-starter-eureka-server

o application.properties
server.port=8888
#eureka相关配置
##关闭当前配置中心的服务抓取和注册
#如果自己到自己注册,需要提供服务名称
spring.application.name=eurekaserver
eureka.client.registerWithEureka=true
eureka.client.fetchRegistry=false
#注册中心的地址,但凡是服务提注册者都需要配置这个地址
#注册者会访问这个地址的接口,携带自己节点的信息注册
eureka.client.serviceUrl.defaultZone=http://localhost:8888/eureka
o 启动类
• 添加一个eureka的注解,就能实现启动加载eureka的自动配置逻辑,实现一个web应用中包含一个eurekaserver的进程
@SpringBootApplication
//eureka注册中心进程启动时需要springboot加载扫描的注解
@EnableEurekaServer
public class StarterEurekaServer {
public static void main(String[] args) {
SpringApplication.run(StarterEurekaServer.class, args);
}}
o web页面
http://localhost:8888/
在这里插入图片描述

上图显示的内容,就是当前注册中心维护的所有服务信息 展示的服务名称,服务实例名称,(服务的详细信息内存中维护的)
o 注册中心的作用
• 管理注册者的服务信息:
内部接收注册者的请求,注册者携带本机/节点的详细参数(ip,port,服务名称) 发送给注册中心,/eureka 接收请求,在内存中存储一个双层map对象 保存所有的内容
在这里插入图片描述

• 服务的监听超时:
多个注册者同时注册一个服务,相当于一个具体的服务被一个集群管理接收请求,每60秒钟判断是否有服务提供者的续约超时达到90秒,一旦满足条件,将会从内存中间超时的实例剔除
1.3入门案例的服务提供者
创建一个工程springboot+springcloud可以被调用一个资源访问 /hello,作为一个服务的提供者,必需生成一个服务名称service-hi 注册在注册中心
o 搭建一个系统springboot+springcloud
pom 继承springboot-parent
导入 springcloud dependencies
o 引入一个依赖

org.springframework.cloud
spring-cloud-starter-eureka

客户端依赖
starter-eureka-server包含了这个依赖
o application.properties
端口 9001
服务名称 service-hi
注册/发现 开启(默认开启)
注册地址 :8888/eureka
server.port=9001
spring.application.name=service-hi
#eureka.client.registerWithEureka=true
#eureka.client.fetchRegistry=true
#注册中心的地址,但凡是服务提注册者都需要配置这个地址
#注册者会访问这个地址的接口,携带自己节点的信息注册
eureka.client.serviceUrl.defaultZone=http://localhost:8888/eureka
o 启动类
添加一个eureka客户端的注解(注册和发现的功能)
@SpringBootApplication
//eureka客户端注解
@EnableEurekaClient
public class StarterEurekaClient1 {
public static void main(String[] args) {
SpringApplication.run(StarterEurekaClient1.class, args);
}}
o 调用功能
/hello?name=wang 返回hello *** name
@RestController
public class HelloController {
@RequestMapping(“hello”)
public String sayHi(String name){
return “hello “+name+”,i am from 9001”;
}
}
o 高可用的集群注册同一个服务
eureka-client1 euerka-client2
eureka-client2修改3处
server.port=9002
controller返回值 I am from 9002
启动类StarterEurekaClient2

在这里插入图片描述

o 注册者实现的逻辑
注册:启动后,当前eureka client一旦赋予注册能力registerWithEureka=true,将会访问注册中心接口8888/eureka 携带详细信息,注册在注册中心,注册中心以服务名称为key值记录一个当前服务的所有节点信息的map对象
续约:eureka client一旦在注册中心提供注册的信息,将会每30秒发起一次心跳(heartbeat)请求,告知注册中心,当前实例是存活的

服务剔除:
30:客户端,发起心跳
60:注册中心,每隔60秒检测一次心跳最后时间
90:注册中心,检测发现超过90秒没有发起心跳检测,将会把该实例剔除

注册中心的保护机制
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY’RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.

庞大的集群中,如果按照正常的逻辑,管理一个微服务集群(100个服务,每个20节点 2000注册者),超时续约的个数如果在15%以内,eureka注册中心,判断是正常超时,将会按照剔除逻辑对实例进行内存数据的清除,如果超过15%,认为适合不正常超时,将会开启保护机制,一旦开启,所有服务信息(map对象)不会做任何的剔除,形成对微服务的保护.

如果需要观察剔除的现象可以将保护机制关闭
注册中心的配置文件中配置保护关闭未false
2.ribbon组件
配合服务治理组件eureka的客户端的发现功能,从注册中心抓取最新的服务注册信息,从而可以在代码内部发起向该服务的访问,使用注册信息中实例的详细信息访问不同的节点实现负载均衡—可以调用服务的,支持负载均衡访问的springcloud客户端组件
ribbon只能实现管理抓取的拦截逻辑,对restTemplate发送的请求做拦截处理
2.1入门案例ribbon负载均衡调用9001/9002
o 创建一个具备开发springboot-springcloud功能的maven工程
pom文件继承自定义的parent-demo工程
o pom添加依赖
• eureka-client(抓取服务)
• ribbon的组件相关依赖
o application.properties
• 9004
• 服务名称 service-ribbon
• 注册抓取/true
• 注册url地址 8888/eureka
server.port=9004
spring.application.name=service-ribbon
eureka.client.serviceUrl.defaultZone=http://localhost:8888/eureka
o 启动类
eureka client相关的注解

创建一个springboot框架管理的内存对象
@Bean
@LoadBalanced
RestTemplate

package cn.tedu;

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

@SpringBootApplication
@EnableEurekaClient
public class StarterRibbon {
public static void main(String[] args) {
SpringApplication.run(StarterRibbon.class, args);
}
@Bean
@LoadBalanced
public RestTemplate initRestTemplate(){
return new RestTemplate();
}}
2.2实现一个负载均衡的调用后端服务service-hi
编写一个ribbon的对外访问的url接口
localhost:9004/hi?name=wang

在这里插入图片描述

通过ribbon直接实现负载均衡访问9001/9002
HelloController
@RestController
public class HelloController {
@Autowired
private HelloService helloService;
//客户端调用hi接口
@RequestMapping(“hi”)
public String sayHi(String name){
return “RIBBON:”+helloService.sayHi(name);
}
}

HelloService
@Autowired
private RestTemplate client;//会因为使用的创建过程

//@Bean+@LoadBalanced注解,ribbon会对restTemplate发送
//任何请求做拦截工作,将域名寻找抓取的服务名称做实力节点
//节点的ip:port的替换
public String sayHi(String name) {
//http://service-hi/hello?name=wang
String sayHi=client.getForObject(
“http://service-hi/hello?name=”+name,
String.class);
return sayHi;
}

2.3实现动态添加扩充服务提供者
单独访问ribbon工程可以实现springcloud的ribbon组件做服务调用服务的功能测试,对于被调用的服务service-hi,只要启动9003作为扩容的节点,添加到eureka注册中心,注册中心维护的注册信息,将会发生变动
在这里插入图片描述

ribbon工程整合了eureka client可以实现服务的抓取,每30秒重新更新抓取一次服务注册信息的map数据
2.4负载均衡的方式
RoundRobinRule 轮询,默认实现的负载均衡的逻辑
RandomRule 随机,随机访问后端服务
WeightedResponseTimeRule 权重访问,权重占比根据后端服务提供者响应的速度,速度越快占比约高

ribbon组件会根据定义的bean对象实现负载均衡,只要创建bean对象就可以,没有发现工程创建任何负载均衡对象,就会默认使用轮询
//修改自定义的随机负载均衡逻辑
@Bean
public IRule initRule(){
return new RandomRule();
}
2.5ribbon实现负载均衡访问服务的原理

在这里插入图片描述

o ribbon具备注册和抓取的能力,启动后会将eureka注册中心的所有map数据抓取到本地存储,每隔30秒更新一次抓取内容
o restTemplate的创建过程是通过LoadBalanced,ribbon会对当前这个对象的所有请求做拦截处理,LoadBalancerInterceptor
o restTemplate发送请求 http://service-hi/hello?name=wang
o ribbon通过拦截解析了服务名称service-hi
o 通过抓取的map对象找到service-hi value(3个节点的详细信息)
o 通过负载均衡对象IRule从3个节点选取一个ip:port拼接到域名所在位置最终发送请求

在这里插入图片描述

注意:springcloud中只要是服务调用服务的过程都是通过ribbon+restTemplate实现(zuul feign)
3.order-user系统整合到springcloud

在这里插入图片描述
最前端的客户端浏览器,如何调用user order的功能?
4 zuul网关集群的调用结构
在这里插入图片描述
完成实现eureka注册中心的高可用

微服务框架

1.纵向拆分的独立系统的集群的问题
1.1没有引入管理的功能
系统的管理,授权,监听,熔断等逻辑都没有引入
1.2静态配置的负载均衡的强耦合
在庞大的纵向拆分的集群中,nginx的静态文件维护负载均衡逻辑,容易出现强耦合:
例如:集群中某些节点出现宕机/迁移
可以引入微服务的概念,从架构角度去解决问题
2.微服务框架
2.1微服务
从一个单体项目,从一个功能比较集中的项目中纵向拆分出来独立运行的功能,每个功能的系统–微服务

微:纵向拆分
服务:功能被调用
2.2微服务框架
一个框架技术能够管理大量的拆分的独立系统,监控,熔断等功能,这种框架技术–微服务框架
2.3spring cloud
轻量级的微服务框架,可以基于springboot的自动配置(减少了自定义的大量代码编写)实现了多个微服务框架的组件功能

eureka :服务治理
ribbon :客户端负载均衡调用
zuul:网关,微服务唯一对外提供的接口
feign:ribbon是同一种客户端,封装了ribbon
hystrix:熔断器
config:微服务中配置文件的管理者

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值