springCloud
微服务,只提供服务,不像以前要做jsp页面,提供rest的服务,不管是任何语言都能使用服务
一,面试题
1,什么微服务
2,微服务之间是如何独立通讯的
3,springCloud和Dubbo有哪些区别
1,通讯机制的区别:dubbo基于rpc,远程过程调用,springCloud基于·Http的RESTful调用
4,springBoot和springCloud,谈谈对他们的理解
6,微服务的优缺点分别是什么?说下你在项目开发中碰到的坑?
7,你所知道的微服务技术栈有哪些?请 列举一二
8,eureka和zookeeper都可以提供服务注册与发现功能,请说说两个的区别?
二,微服务概述
学术维度:
它提倡将单一应用程序划分成一组小的服务,每个服务再其独立的自己的进程中,服务之间互相协调,互相配合,为用户提供价值
技术维度理解:
微服务的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底地去耦合,每一个微服务提供单个业务功能,一个服务做一件事,从技术角度看就是一种小儿独立的处理过程,类似进程概念能够自行单独启动或销毁,拥有自己独立的数据库。
2,微服务与微服务架构
微服务:
强调的是服务的大小,它关注的是某一个点,是具体解决某个问题/提供落地对应服务的一个服务应用,狭义的看,可以看作eclipse里面的一个个微服务工厂
微服务架构:、
微服务架构是一种架构模式,它提倡将单一应用程序划分一组小的服务,服务之间互相协调,互相配合,每个服务运行在其独立的进程中,服务于服务间采用轻量级的通讯机制互相协作(通常是基于Http协议的RESTful API)。每个服务都围绕着具体业务进行构建,并且能够被独立的部署到生产环境,类生产环境等。另外,应当尽量避免统一的,集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言,工具对其进行构建。
3,微服务优缺点
优点:
每个服务足够内聚,足够小,代码容易理解这样能聚焦一个指定的业务功能或业务需求
开发简单,开发效率提高,一个服务可能就是专一的只干一件事
微服务能够被小团队单独开发
微服务是松耦合,是有功能意义的服务,无论是在开发阶段或部署阶段都是对立的、
微服务能使用不同的语言开发
易于和第三方集成,微服务允许容易灵活的方式继承自动部署,通过持续集成工具,如jenkins,hudson
微服务只是业务逻辑代码,不会和html,css或其他界面组件融合
每个微服务都有自己的存储能力,可以有自己的数据库,也可以有统一数据库
缺点:
开发人员处理分布式系统的复杂性
多服务运维难道,随着服务的增加,运维的压力增加
系统部署依赖
服务间通讯成本
数据的一致性
系统集成测试
性能监控
4,微服务技术栈有哪些?
微服务条目 | 落地技术 |
服务开发 | springboot,spring,springMVC |
服务配置与管理 | Netflix公司的Archaius,阿里Diamond等 |
服务组成与发现 | Eureka,Consul,zookeeper等 |
服务的调用 | REST,RPC,GRPC |
服务的熔断器 | Hystrix,Envoy等 |
负载均衡 | Ribbo,Nginx等 |
服务接口调用(客户端调用服务的简化工具) | Feign等 |
消息队列 | kafka,RabbitMQ,ActiveMQ等 |
服务配置中心管理 | springCloudConfig,chef等 |
服务路由(API网关) | zuul |
服务监控 | Zabbix,Nagios,Metrics,Spectator等 |
全链路追踪 | Zipkin,Brave,Dapper等 |
服务部署 | Docker,OpenStack,Kuber |
数据流操作开发包 | springCloud Stream(封装与redis,rabbit,kafka等发送接收消息) |
事件消息总线 | springCloud Bus |
选型依据:
整体解决方案和框架成熟度
社区热度
可维护性
springcloud是什么?
springCloud,基于springboot提供了一套微服务解决方案,包括服务注册与发现,配置中心,全栈路由监控,服务网关,负载均衡,熔断器等组件,除了基于Netflix的开源组件做高度抽象封装之外,还有一些选型中立的开源组件
springcloud利用springBoot的开发便利性巧妙的简化分布式系统的基础设施的开发,springcloud为开发人员提供了快捷构建分布式系统的一些工具,包括配置管理,服务发现,断路由,路由,微服务,事件总线,全局锁,决策竞选,分布式会话等,,它们都可以用springboot的开发风格做到一键启动与部署.
springcloud是分布式微服务架构下的一站式解决方案,是各个微服务架构落地技术的集合体,俗称微服务全家桶
springcloud和springboot是什么关系?
springboot专注于快速方便开发单个个体
springcloud是关注全局的微服务协调治理框架,它将springboot开发的一个个单个微服务整合并管理起来,为各个微服务之间提供,配置管理,服务发现,断路由,路由,微服务,事件总线,全局锁,决策竞选,分布式会话等集成服务。
springBoot可以离开springcloud独立使用开发项目,但是springcloud离不开springboot,属于依赖关系。
总结:springboot专注于快速,方便 的开发单个微服务个体,springcloud关注全局的服务治理框架。
springcloud和Dubbo的对比?
Dubbo | spring cloud | |
---|---|---|
服务注册中心 | zookeeper | spring cloud Netfix Eureka |
服务调用中心 | RPC | REST API |
服务监控 | Dubbo-monitor | spring boot Admin |
断路由器 | 不完善 | spring cloud Netfix Hystrix |
服务网关 | 无 | spring cloud Netfix Zuul |
分布式配置 | 无 | spring cloid Config |
服务跟踪 | 无 | spring cloud sleuth |
消息总线 | 无 | spring cloud Bus |
数据流 | 无 | spring Cloud Stream |
批量任务 | 无 | Spring Cloud Task |
最大的区别:springcloud抛弃了Dubbo的RPC通讯,采用的是基于http的rest方式
springcloud文档参考:
https://springcloud.cc/spring-cloud-netflix.html
api文档:
http://cloud.spring.io/spring-cloud-static/Dalston.SR1/ 英文版
https://springcloud.cc/spring-cloud-dalston.html 中文版
社区:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
<repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
@AllArgsConstructor //全参构造函数 @NoArgsConstructor //无参构造函数 @Data //set和get @Accessors(chain = true) //链式编程 public class Dept implements Serializable {
RestTemplate提供了多种便捷访问远程Http服务的方法, 是一种简单便捷的访问restful服务模板类,是Spring提供的用于访问Rest服务的客户端模板工具集
官网api
使用restTemplate访问restful接口非常的简单粗暴无脑。 (url, requestMap, ResponseBean.class)这三个参数分别代表
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
@RequestMapping(value="/consumer/dept/get/{id}") public Dept get(@PathVariable("id") Long id) { return restTemplate.getForObject(REST_URL_PREFIX+"/dept/get/"+id, Dept.class); }
Eureka是什么
Eureka是Netflix的一个子模块,也是核心模块之一。Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移。服务注册与发现对于微服务架构来说是非常重要的,有了服务发现与注册,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了。功能类似于dubbo的注册中心,比如Zookeeper。
Eureka的基本架构
Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现(请对比Zookeeper)。
Eureka 采用了 C-S 的设计架构。Eureka Server 作为服务注册功能的服务器,它是服务注册中心。
EurekaClient是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)
建议使用springcloud的版本为Greenwich M1,Finchley SR2(支持springboot2.x以上版本)
Eureka server的使用
1,创建一个Eureka server工程
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
3.配置服务
server:
port: 7001
eureka:
instance:
hostname: localhost #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url: #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
4,主配置类
@EnableEurekaServer //EurekaServer服务器端启动类,接受其它微服务注册进来
服务提供端
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
3,配置
spring:
application:
name: microservicecloud-dept
eureka:
client:
service-url: #客户端注册进eureka服务列表内
defaultZone: http://localhost:7001/eureka/
instance:
instance-id: microservicecloud_8001 #自定义服务名称信息
prefer-ip-address: true #访问路径可以显示IP地址
4,主配置类
@EnableEurekaClient //本服务启动后会自动注册进eureka服务中
@EnableDiscoveryClient
和@EnableEurekaClient
的区别:
就是如果选用的注册中心是eureka,那么就推荐@EnableEurekaClient,如果是其他的注册中心,那么推荐使用@EnableDiscoveryClient。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
下节我们继续谈Eureka服务