euraka服务注册与发现
生产者 server
消费者 ribbon(每个消费者自己的负载均衡)、feign
消费者ribbon (远程调用):
RestTemplate调用euraka里已注册中的某个项目中的某些方法,项目名称: spring.application.name=Service-Hello (name名称全大写)
如果负载均衡是在euraka上做,压力都在euraka上的,如果负载均衡是消费者上进行的,那么压力就分担到了每一个消费者上了。
消费者做缓存,减小euraka压力,缓存存在时间固定,定时清理缓存。
微服务是后台之间的调用
多个生产者(server)的调用:
多个生产者:name名称一样,端口号不一样
负载均衡(默认是使用【轮询】进行负载均衡)
缺点: 远程调用编写杂乱,不规范
feign(是在ribbon上进行了封装,使程序更加规范):
ribbon是在某个类中的某个方法,每次调用需要填写调用的name调用的返回值,调用的参数等等,feign是通过在接口上添加注解@FeignClient("Service-Hello"),注解里的name就是调用的项目名称,大小写不敏感。
euraka部署多个节点(集群)
中心化:nigix为例,主nginx和从nginx,主没挂之前从是没有运行的,主挂了之后从才补上来进行运行。
去中心化:还是nginx为例,主和从一起运行,主挂了之后从继续运行。
euraka去中心化。
euraka集群相互注册(properties配置)
断路器hystrix
如果euraka定时进行心跳检测,在几个周期都没有心跳,那么久判定节点故障,但是前几个周期可能会有服务调用该节点,产生问题。
现在需要当某些节点故障的时候,就不要去继续访问了,其他的服务只访问正常运行的节点,这个需要断路器实现故障转移。
1.服务降级
当发生故障的时候,不会直接将报错信息代码直接显示到页面上,而是显示一些另外的内容,比如写好的错误页面。(就是在失败的时候,指定程序执行什么什么东西)
2.故障转移
ribbon中添加hystrix
pom中引入hystrix
feign中使用hystrix
feign中集成hystrix,所以只需要在properties里配置一下(feign.hystrix.enabled=true)。
springboot
springboot注册servlet、Filter、listener
springboot读取spring配置文件
springboot访问jsp
微服务设计模式
聚合模式
聚合层(例如:网站首页) + 原子层(具体的某些服务,例如:用户服务)
电商购物功能设计:
电商前台 + 商品服务、购物车服务、交易服务
前端微服务化
将html和js做成模板,通过后台传递过来的json来加载模板
vue、anglaJs、nodeJs:后端界面展现
数据库切分:
跨库关联查询解决方案
分布式事物处理:
TCC方案
(try,confirm,cancel事物的补偿)最终一致性(过程中可能会有不一致的情况,不过这个不一致时间会很短)
如果confirm失败的概率只有1%,那么cancel的失败概率为1%*1%,做一个记录日志,最后进行人工干预即可。
阿里GTS解决方案
基于消息(消息队列)的最终一致性方案
缺点:出现数据不一致性的时间会很长
代理模式(if else)
链式模式(串成一个长链,不太通用)
分支模式(聚合+代理模式组合使用)
异步模式(添加使用mq消息队列(mq需要足够大,需要分布式mq))
数据共享模式
问题: 如果数据库的某个表要进行更改(添加删除某个字段),相关服务的对应内容都需要更改...
解决:一个表对应一个微服务进行操作,比如user表这个表的curd都交个A服务,其他服务需要对user表进行操作查看,都去调用A服务即可。
微服务+大数据 使用数据共享模式
微服务架构实现读写分离
session管理与无状态设计
如果某个服务挂了,其他服务需要继续执行该操作,需要获取到用户的session,那么如何存放session呢?
负载均衡的session同步与故障转移
1.将session传递到前台,然后用户每次操作的时候,就能在后台获取的该session,缺点就是安全问题
2.利用redis的特性,将session存储到redis中
微服务无状态设计原则
无状态通信:RESTful风格
服务网关(Gateway)
路由网关(Zuul)
流量控制
令牌桶算法:限制突发性流量
漏桶算法:平滑流量、流量整形
节流:去掉相同的请求