目录
- 微服务------一种软开技术,面向服务SOA架构的一种变体,把程序构造为很多松耦合的服务。
- 分布式------一种部署方式,提高系统稳定性,优化性能。
分散部署在不同的机器。是一种面向SOA架构的,服务之间也是通过RPC等方式交互的。逻辑架构设计完后就该做物理架构设计,系统应用部署在超过一台服务器或虚拟机上,且各分开部署的部分彼此通过各种通讯协议交互信息,就可算作分布式部署,生产环境下的微服务肯定是分布式部署的,分布式部署的应用不一定是微服务架构的,比如集群部署,它是把相同应用复制到不同服务器上,但是逻辑功能上还是单体应用。
微服务
1、微服务设计原则
- 单一职责----每个微服务只需实现自己的业务逻辑;
- 服务自治----每个微服务从开发、测试、运维、存储等均独立,不依赖于其它模块;
- 轻量级通信----通信的语言轻量,通信方式需跨语言、跨平台的;
- 接口明确----接口尽量做的更通用,更灵活,从而尽量避免其它模块连带调整。
2、微服务四个核心问题:
- 这么多服务,客户端如何访问?
- 这么多服务,服务间如何通信?
- 这么多服务,如何实现和治理?
- 这么多服务,服务挂了怎么办?
3、微服务的优缺点?
- 单一职责,聚焦指定业务功能,开发效率高;
- 松耦合,各阶段独立、存储可以独立也可以统一;
- 易于与第三方平台集成,自动部署(jenkins、Hudson、bamboo...);
- 开发人员要处理分布式系统的复杂性、运维测试成本增大;
- 服务器通信成本,部署依赖问题,内存开销大;
4、解决微服务的方案
- XVCZXCVBNM,./
- SpringCloud Alibaba-一站式解决
5、微服务通信方式
1、RPC通信介绍
RPC(Remote Procedure Call Protocol)远程过程调用,要从一台计算机上执行另外一台计算机上的程序。跨越了物理服务器的限制,在网络中完成。基于Socket,工作在会话层。自定义数据格式,速度快,效率高。
- 两个重点:能否快速建立连接、序列化和反序列化机制快不快;
- 框架很多:Dubbo、HSF、早期的webservice、谷歌开源的gRPC、Apache的Thrift、新浪微博的Montan等;
RPC调用过程
- **序列化:**把对象转换为字节序列的过程称为对象的序列化,编码过程。
- **反序列化:**把字节序列恢复为对象的过程称为对象的反序列化,也解码过程。
2、HTTP通信介绍
http其实是一种网络传输协议,基于TCP,工作在应用层,规定了数据传输的格式。现在客户端浏览器与服务端通信基本都是采用Http协议,也可以用来进行远程服务调用。缺点是消息封装臃肿,优势是对服务的提供和调用方没有任何技术限定,自由灵活,更符合微服务理念。开源http客户端工具,例如:HttpClient(Apache)-OKHttp(android轻量网络通信框架,移动支付Square公司贡献(还提供Picasso图片缓存框架),okhttp用于替代HttpUrlConnection和Apache HttpClient)-URLConnection(URLConnection任何网络连接都需要经过socket才能连接,HttpURLConnection不需要设置socket,所以,HttpURLConnection并不是底层的连接,而是在底层连接上的一个请求。这就是为什么HttpURLConneciton只是一个抽象类,自身不能被实例化的原因。)
Spring提供了一种简单便捷的模板---RestTemplate。底层是HttpURLConnection实现!使用restTemplate访问restful接口非常的简单粗暴无脑。(url、requestMap、ResponseBean.class)这三个参数分别代表 请求地址、请求参数、HTTP响应转换被转换成的对象类型。RestTemplate方法的名称遵循命名约定,第一部分指出正在调用什么HTTP方法,第二部分指示返回的内容。本例中调用了restTemplate.postForObject方法,post指调用了HTTP的post方法,Object指将HTTP响应转换为您选择的对象类型。
小结:
1.调用的各种实现所谓的http连接的api(包括java自带的httpurlconnection)其底层基本上都是调用的jdk的socket接口。
2.socket是基于tcp/ip协议封装的一套实现tcp连接的接口,或者说是工具。
3.所以会说其实http也是通过socket来实现的这种看似没有问题但又含糊不清的说法。
4.http只是一种协议,什么请求头,请求题,响应头都是根据固定的格式制定的报文,然后最终(可能不直接调用volley,okhttp等)都会通过socket接口将这些报文发给服务器或者客户端。
SpringCloud
SpringCloud是个生态,并不是一门技术。六大模块:负载均衡、服务注册与发现、监控、配置管理、网关、分布式追踪;
1、Eureka注册中心
首先我们来解决第一问题,服务的管理。犹瑞卡,注册中心来自NetFlix。
Eureka负责管理、记录服务提供者的信息。服务调像下单一样吧需求告诉Eureka,Eureka就会告诉所需服务。同时,服务提供方与Eureka之间通过 “心跳” 机制进行监控,当某个服务提供方出现问题,Eureka自然会把它从服务列表中剔除。这就实现了服务的自动注册、发现、状态监控。
- Eureka:就是服务注册中心(可以是一个集群),对外暴露自己的地址
- 提供者:启动后向Eureka注册自己信息(地址,提供什么服务)
- 消费者:向Eureka订阅服务,Eureka会将对应服务的所有提供者地址列表发送给消费者,并且定期更新
- 心跳(续约):提供者定期通过http方式向Eureka刷新自己的状态
1,启动器依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2,配置文件
server:
port: 10086
spring:
application:
name: eureka-server
eureka:
client:
service-url:
# eureka 服务地址,如果是集群的话;需要指定其它集群eureka地址
defaultZone: http://127.0.0.1:10086/eureka
# 不注册自己,集群的话就注册
register-with-eureka: false
# 不拉取服务
fetch-registry: false
3,服务注册与发现
- 服务注册:在服务提供工程user-service上添加Eureka客户端依赖;自动将服务注册到EurekaServer服务地址列表。
Provider启动时,会检测配置属性中的: eureka.client.register-with-erueka=true 参数是否正确,默认true。会向EurekaServer发起一个Rest请求,并携带自己的元数据信息,EurekaServer会把这些信息保存到一个双层Map结构中。
第一层Map的Key---服务id,一般是配置中的 spring.application.name 属性
第二层Map的key---服务实例id。一般host+ serviceId + port,例如: localhost:user-service:8081
值则是服务的实例对象,也就是说一个服务,可以同时启动多个不同实例,形成集群。 - 服务发现:在服务消费工程consumer-demo上添加Eureka客户端依赖;可以使用工具类根据服务名称获取对应的服务地址列表。
- 添加Eureka客户端依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
- 添加启动引导类注解
启动类加入@EnableDiscoveryClient 注解 - 修改配置
spring:
application:
name: consumer-demo(两个服务的名字)
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka(Eureka中心地址)
4,Eureka高可用
eureka-server
eureka:
server:
# 服务失效剔除时间间隔,默认60秒
eviction-interval-timer-in-ms: 60000
# 关闭自我保护模式(默认是打开的)
enable-self-preservation: false
user-service
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
instance:
# 更倾向使用ip地址,而不是host名
prefer-ip-address: true
# ip地址
ip-address: 127.0.0.1
# 续约间隔,默认30秒
lease-renewal-interval-in-seconds: 5
# 服务失效时间,默认90秒
lease-expiration-duration-in-seconds: 5
consumer-demo