Spring Cloud中包含了非常多的子框架,Spring Cloud netflix就是其中一套框架,是先由Netflix开发,后来又并入Spring Cloud大家庭,它的主要提供模块有:服务发现、断路器和监控、智能路由、客户端负载均衡等
1.Eureka,服务注册和发现,它提供了一个服务注册中心、服务发现的客户端,还有一个方便的查看所有注册的服务的界面。 所有的服务使用Eureka的服务发现客户端来将自己注册到Eureka的服务器上。
2.1Ribbon,即负载均衡,Zuul网关将一个请求发送给某一个服务的应用的时候,如果一个服务启动了多个实例,就会通过Ribbon来通过一定的负载均衡策略来发送给某一个服务实例。
2.2Feign,服务客户端,服务之间如果需要相互访问,可以使用RestTemplate,也可以使用Feign客户端访问。它默认会使用Ribbon来实现负载均衡。
3.Hystrix,监控和断路器。我们只需要在服务接口上添加Hystrix标签,就可以实现对这个接口的监控和断路器功能
4.Zuul,网关,所有的客户端请求通过这个网关访问后台的服务。他可以使用一定的路由配置来判断某一个URL由哪个服务来处理。并从Eureka获取注册的服务来转发请求。
5.
Eureka是netflix的一个子模块,也是核心模块之一。Eureka是一个基于rest的服务,用于定位服务,以实现云端中间层服务发现和故障转移,服务注册于发现对于微服务来说是非常重要的,有了服务发现与注册,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了,功能类似于dubbo的注册中心。
Eureka的基本架构:
一句话总结:某时刻某一个服务不可以使用了,eureka不会立刻清理,依旧会对微服务的信息进行保存。
5.1eureka依赖:
org.springframework.cloud
spring-cloud-starter-eureka-server
1.4.6.RELEASE
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-starter-netflix-test
test
5.2application.yml配置:
server:
port: 8081
eureka:
instance:
hostname: localhost #eureka服务端的实例名称
# instance-id: springcloud-provider-8081 #修改eureka网页上的默认描述信息
# prefer-ip-address: true #true , 可以显示服务的IP地址
client:
register-with-eureka: false #表示是否像eureka注册中心注册自己
fetch-registry: false #fetch-registry如果为false,则表示自己为注册中心
service-url: #注册中心提供的注册地址
defaultZone: http://localhost:8081/eureka/
5.3启动类的注解配置
//启动之后访问:localhost:8083
@SpringBootApplication
@EnableEurekaServer //服务端的启动类,可以接受别人注册进来
6.provider服务端配置:
6.1 1.pom依赖:
com.neu
springcloud-api
1.0-SNAPSHOT
org.springframework.cloud
spring-cloud-starter-eureka
1.4.6.RELEASE
org.springframework.boot
spring-boot-starter-actuator
junit
junit
com.oracle
ojdbc6
11.2.0
org.projectlombok
lombok
1.16.10
log4j
log4j
1.2.17
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.2
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-starter-web
2.1.4.RELEASE
org.springframework.boot
spring-boot-starter-jdbc
2.1.4.RELEASE
org.springframework.boot
spring-boot-devtools
true
6.2 application.yml配置
server:
port: 8082
spring:
application:
name: springcloud-provider-8082
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&serverTimezone=UTC
username: root
password: 123456
# driver-class-name: oracle.jdbc.driver.OracleDriver #orcal配置
# url: jdbc:oracle:thin:@127.0.0.1:1521:orcl
# username: scott
# password: tiger
mybatis:
type-aliases-package: com.neu.entity
mapper-locations: classpath:/mapper/*Mapper.xml
#Eureka的配置,服务注册到哪里
eureka:
client:
service-url:
defaultZone: http://localhost:8081/eureka/ #注册中心的地址
#集群配置修改localhost镜像地址C:\Windows\System32\drivers\etc\hosts
6.3 启动类注解配置:
@SpringBootApplication
@EnableEurekaClient //在服务启动后自动注册到eureka中
@EnableDiscoveryClient //开启服务发现
1.LB:既负载均衡,在负载均衡(Load Balance),在微服务或分布式集群中京城使用的一种应用。
2.负载均衡简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA(高可用)。
3.常见的负载均衡软件Netflix ,Lvs等等。
4.负载均衡简单分类:
1.集中式LB
即在服务的消费方和提供方之间使用独立的LB设施,如Nginx,由该设施负责把访问请求通过你某种策略转发至服务的提供方!
2.进程式LB
将LB逻辑继承到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些选出一个合适的服务。
Ribbon就属于进程LB,他只有一个类库,继承与消费方进程,消费方通过它来获取到服务提供方的地址。
消费者配置依赖:
org.springframework.cloud
spring-cloud-starter-ribbon
1.4.6.RELEASE
@Configuration
public class ResetConfig {
@Bean
@LoadBalanced //实现负载均衡,以轮巡的方式使每个服务均匀执行
public RestTemplate restTemplate(){
return new RestTemplate();
}
@Bean
public IRule Myrole(){ //服务提供者以随机的方式被访问
return new RandomRule();
}
}
@RestController
@RequestMapping("user")
public class UserController {
@Autowired
private RestTemplate restTemplate;
//以注册中心的provider的id名字进行访问
private static final String REST_URL_PREFIX="http://SPRINGCLOUD-PROVIDER-USER";
@GetMapping(value = "/findAll")
public List findAll(){
return restTemplate.getForObject(REST_URL_PREFIX+"/user/findAll",List.class);
}
}
feign是声明式的web service客户端,它让微服务之间的调用变得更简单,类似controller调用service,Springcloud集成了Ribbon和Eureka,可在使用Feign时提供负载均衡的http客户端。
只需要创建一个接口,然后添加注解即可。
Feign,主要是社区,大家都习惯面向接口编程。这个是很多开发人员的规范,调用微服务访问的两种方式。
1.feign旨在使编写java http客户端变的更容易。
2.前面在使用Ribbon+RestTemplate时,利用RestTemplate对http请求的封装处理,形成了一套模板化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个服务自行封装一些客户端来包装这些依赖服务的调用。所以,feign再次基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义,在feign的实现下,我们只需要创建一个接口并使用注解的方式来配置它,(类似与以前Dao接口上标注的Mapper注解,现在是一个微服务接口上面标注一个feign注解即可。)即可完成对服务提供方的接口绑定,简化了使用spring cloud ribbon时,自动封装服务调用客户端的开发量。
利用ribbon维护了MicroServiceCloud-dept的服务列表信息,并且通过轮询实现了客户端的负载均衡,而与ribbon不同的是,通过feign只需要定义服务绑定接口且以声明式的方法,优雅而且简单的实现了服务调用。
消费者服务和api服务添加依赖:
org.springframework.cloud
spring-cloud-starter-feign
1.4.6.RELEASE
feign接口定义:
@Service("userClientBiz")
@FeignClient(value = "SPRIGNCLOUD-PROVIDER-HYSTRIX-8084")
public interface UserClientBiz {
//测试provider-8082中的feign
@GetMapping(value = "/user/findAll")
public List findAll();
}
消费者控制器调用:
@RestController
@RequestMapping("user")
public class UserController {
@Autowired
private UserClientBiz userClientBiz;
@GetMapping(value = "/findAll")
public List findAll(){
return userClientBiz.findAll();
}
@GetMapping(value = "findById/{id}")
public User findById(@PathVariable("id")int id){
return userClientBiz.findById(id);
}
}
消费者启动类加注解打开feign:
@EnableFeignClients(basePackages = {"com.neu"})//扫描api com.neu下的所有文件
@ComponentScan("com.neu") //扫描本服务(消费者)com.neu下的所有文件
1. 分布式系统面临的问题:
复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免的失败!
2.服务雪崩:
多个服务之间的调用时,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其他服务,这就是所谓的“扇出”、如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起崩溃,所谓的“雪崩效应”。
对于高流量的应用来说,单一的后端依赖可能会导致所有服务器上的所有资源都在几秒钟内饱和。比失败更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,备份队列,线程和其他系统资源紧张,导致整个系统发生更多的级联故障,这些都表示需要对故障和延迟进行隔离和管理,以便单个依赖关系失败,不能取消整个应用程序或系统。
3.什么是hystrix:
hystrix是一个用于处理分布式系统的延迟和容错开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时,异常等。Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障。以提高分布式系统的弹性。
4.断路器:
断路器本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控,向调用方放回一个服务预期的,可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方法无法处理的异常,这样就可以保证了服务调用方法的线程不会被长时间,不必要的占用。从而避免了故障在分布式系统中的蔓延,乃至雪崩。
5.服务熔断是什么:
熔断机制是对应雪崩效应的一种微服务链路保护机制。
当扇出链路的某个微服务不可用或者响应时间太长,会进行服务降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。当检测到改节点微服务调用响应正常后恢复调用链路。在springcloud框架里熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的状况。当失败的调用到一定的阈值,缺省是5秒内20次调用失败就会启动熔断机制。熔断机制的注解是@HystrixCommand.
provider服务添加依赖:
org.springframework.cloud
spring-cloud-starter-hystrix
1.4.6.RELEASE
provider控制类:
@HystrixCommand注解是方法级别的,在你需要捕获的方法上加上注解
@RestController
@RequestMapping("user")
public class UserController {
@Autowired
private UserBiz userBiz;
@GetMapping(value = "/findById/{id}")
@HystrixCommand(fallbackMethod = "hystrix_findById") //熔断器跳转备用方法
public User findById(@PathVariable("id")int id){
User user =userBiz.findById(id);
if (user==null){
throw new RuntimeException("id=>"+id+",不存在该用户或者找不到");
}
return user;
}
public User hystrix_findById(@PathVariable("id") int id){
User user = new User();
user.setId(id);
user.setUname("id没有对应的信息");
return user;
}
}
provider启动类添加注解:
@EnableCircuitBreaker //加上@EnableCircuitBreaker注解之后,就可以使用断路器功能
hystrix还可以做 服务降级:客户端、从整体网站请求负载考虑,当某个服务熔断或者关闭之后,服务将不再被调用~ 。此时在客户端,我们可以准备一个 FallbackFactory,返回一个默认的值(缺省值),整体的服务水平下降了~但是,好歹能用
1.什么是zuul:
Zuul包含了对请求的路由和过滤两个最主要的功能:
其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础,而过滤器功能则负责对请求的处理过程进行干预,是实现请求校验,服务聚合等功能的基础。Zull和Eureka进行整合,将Zuul自身注册为Eureka服务治理下的应用,同时从Eureka中获得其他微服务的信息,也即以后的访问微服务都是通过Zuul跳转后获得。
注意:Zuul服务最终还是会注册进Eureka.
提供:代理+路由+过滤三大功能。
2.zull能干嘛:
1.路由
2.过滤
文章参考:(10条消息) springCloud五大核心组件介绍_明快de玄米61的博客-CSDN博客_springcloud五大核心组件
Spring Cloud Netflix 中文文档 参考手册 中文版