1、什么是微服务?
是一种架构模式或者说是一种架构风格,它提倡将单一的应用程序划分成一组小的服务,每个服务运行在其独立的进程中,服务之间互相协调、互相配合,为用户提供最终价值。每个服务独立部署、发布。
2、微服务之间如何独立通讯?
3、springBoot和springCloud,请谈谈对他们的理解?
springBoot关注单个服务
springCloud是分布式微服务架构下的一站式解决方案,是各个微服务架构落地技术的集合体。关注全局微服务协调治理框架,它将springBoot开发的一个个单体整合起来,为各个微服务之间提供配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞争、分布式session等服务。
4、什么是服务熔断,什么是服务降级?
5、微服务的优缺点是什么?说说你在项目开发中遇到的坑。
优点:
每个服务足够内聚,足够小。
开发简单、效率高,一个服务专注于一件事。
微服务是松耦合的,是有功能意义的服务,无论是在开发阶段还是部署阶段都是独立的。独立部署,独立运行
可以使用不同的语言开发,易于和第三方集成。
每个微服务都有自己的存储的能力,可以有自己的数据库,也可以有统一数据库。
缺点:
运维复杂,成本高、服务间通信成本高、数据一致性、部署依赖。。。。
6、你知道的微服务技术栈有哪些?
服务开发:springBoot、spring、springmvc
服务配置与管理:Archaius、Diamond
服务注册与发现:eureka、Consul、Zookeeper
服务调用:Rest、RPC、gRPC
服务熔断器:Hystrix、Envoy
负载均衡:Ribbon、Nginx
服务接口调用:Feign
消息队列:Kafka、RabbitMQ、ActiveMQ等
配置中心:SpringClougConfig、chef等
路由:zuul
服务监控:Zabbix,Nagios、Metrics、Spectator等
全链路追踪:Zipkin、Brave、Dapper等
服务部署:Docker、OpenStack、Kubernetes等
数据流操作开发包:springCloud Stream
消息总线:Spring Cloud Bus
批量处理:
分布式session:
7、eureka和zookeeper都可以提供服务注册与发现功能,请说说两个的区别?
CAP原理(c强一直性,A可用性,P分区容错),任何分布式系统只能保证满足其二,而分区容错是必须保证的。
zookeeper 保证CP
当集群中master节点挂了,其余节点会进行选举并且选举时间过长(30-120S)期间集群不可用。
eureka保证AP
自我保护机制,各个节点是平等的没有主从。
8、dubbo和springCloud区别?
dubbo | springCloud | |
---|---|---|
注册中心 | zookeeper | spring Cloud Netflix Eureka |
调用方式 | RPC | REST API |
服务监控 | Dubbo-monitor | Spring Boot Admin |
断路器 | 不完善 | Spring Cloud Netflix Hystrix |
服务网关 | 无 | Spring Cloud Netflix zuul |
分布式配置 | 无 | Spring Cloud Config |
服务跟踪 | 无 | Spring Cloud Steuth |
消息总线 | 无 | Spring Cloud Bus |
数据流 | 无 | Spring Cloud Stream |
批量任务 | 无 | String Cloud Task |
...... | ...... | ...... |
9、Ribbon是什么?
spring cloud Ribbon是基于NetFlix实现的一套客户端 负载均衡的工具。
主要是提供客户端的软件负载均衡(Load Balance)算法,也可以自定义。
集中式LB:即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5,也可以是软件,如nginx),由该设施复制把访问请求通过某种策略转发至服务的提供方。
进程内LB:将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务器。
Ribbon就属于进程内LB,它只是一个类库,集成与消费方进程,消费方通过它来获取到服务提供方的地址。
10、Feign是什么?
Feign是一个声明式WebService客户端。使用Feign能让WebService客户端根据简单,它的使用方法是定义一个接口,然后在上面添加注解,同时也支持JAX-RS标准的注解,Feign也支持可插拔式的编码器和解码器。springCloud对Feign进行了封装,使其支持了springMVC标准注解和HTTPMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。
前面在使用Ribbon+RestTemplate时,利用RestTemplate对Http请求的封装处理,形成了一套模板化的调用方法。但在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以Feign在此基础上做了进一步封装,由它来帮助我们定义和实现依赖服务接口的定义。在Feign的实现下,我们只需要创建一个接口并使用注解的方式来配置它,即可完成对服务提供方的接口绑定,简化了使用Spring cloud Ribbon时,自动封装服务调用客户端的开发量。
Feign集成了Ribbon 利用Ribbon维护了MicroerviceCloud-Dept的服务列表列表,并且通过轮询实现了客户端的负载均衡。而与Ribbon不同的是,通过Feign只需要定义服务绑定接口以声明式的方法,优雅而简单的实现了服务调用。
11、Hystrix
Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。
“短路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控,向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方法无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要的占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。服务熔断是在服务的提供方设置。
在服务提供方对应方法上添加如下注解
//fallbackMethod 指定的服务熔断方法的参数类型和返回值必须与需要熔断的方法一致。
@HystrixCommand(fallbackMethod = "listFallback")
在启动类上开启熔断支持
@EnableCircuitBreaker //服务熔断支持
12、服务降级
当整体资源不足时,不得不将部分服务停止,待资源充足时重新开启。
1、需要结合Feign使用,新建FallbackFactory实现类,重写create方法。
@Component//不能忘记添加
public class UserApiServiceFallbackFactory implements FallbackFactory<UserApiService> {
@Override
public UserApiService create(Throwable throwable) {
return new UserApiService() {
@Override
public List<User> list() {
return null;
}
};
}
}
2、公共接口指定fallbackFactory类。
@FeignClient(value = "SPRINGCLOUD-USER",fallbackFactory=UserApiServiceFallbackFactory.class)
public interface UserApiService {
@RequestMapping(value = "/springcloud-user/user/list",method = RequestMethod.GET)
List<User> list();
}
3、客户端(调用方)开启熔断支持
feign:
hystrix:
enabled: true #开启服务熔断
4、客户端(调用方)启动类修改
@EnableFeignClients(value = {"com.liang"}) //不加value扫描不到API中的service springboot默认扫描Application.java本包及其子包的代码
@EnableEurekaClient
@SpringBootApplication(scanBasePackages = {"com.liang"})
public class SpringcloudOrderFeignApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudOrderFeignApplication.class, args);
}
}
5、常见坑:FallbackFactory实现类需要添加@Component、当包名不一致时需要指定扫描包名,否则扫描不到。
@SpirngBootApplication扫描的是当前类所在的包及其子包,当包名不一致时虽然通过maven引入了公共模块jar包但依然无法被扫描到,报 No fallbackFactory instance of type class 。。。。。
13、HystrixDashboard
Hystrix持续的记录所有通过Hystrix发起的请求的执行信息,并以统计报表和图形的形式展示给用户,包括每秒执行多少请求多少成功、多少失败等。Hystrix通过Hystrix-metrics-event-stream项目实现了对以上指标的监控。springcloud提供了Hystrix Dashboaed的整合,对监控内容转化成可视化界面。