2-1 微服务和其他常见架构
1.https://martinfowler.com/articles/micrservices.html
2.微服务是一种架构风格,由一系列微小的服务共同组成,跑在自己的进程里,每个服务为独立的业务开发,独立部署,有分布式 的管理
3.单体架构的缺点:开发效率低,代码维护难,部署不灵活,稳定性不高,扩展性不够
4.分布式的定义:旨在支持应用程序和服务的开发,可以利用物理架构由多个自治的处理元素(多节点),不共享内存,但通过网络发送消息合作。
2-2 从一个极简的微服务架构开始
1.微服务架构的基础框架、组件
服务注册中心:微服务内部之间相互调用
服务网关(Service Gateway):外部访问,将服务暴露出去,对外屏蔽后台服务的细节,路由,可以做限流和容错功能,安全(服务认证,授权,反爬虫)
后端通用服务(也称中间层服务Middle Tier Service):启动时将信息注册到服务表
前端服务(也称边缘服务Edge Service):聚合,裁剪
2.Spring Cloud是一个开发工具集,包含多个子项目
-----利用Spring Boot的开发便利
-----主要是基于对Netflix开源组件的进一步封装
3.Spring Cloud简化了分布式开发
3-1 Spring Cloud Eureka
1.基于Netflix Eureka做了二次封装
2.Eureka Server:注册中心
Eureka Client:服务注册
3-2 Eureka Server
1.file---->new---->project----->Spring Initializr----->Default:https://start.spring.io
Dependencies:Cloud Discovery:Eureka Server
2.启动入口类
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
3.关于版本
http://spring.io
projects----》SpringCloud(往下翻)
4.启动后一直报错
com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:112) ~[eureka-client-1.9.3.jar:1.9.3]
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56) ~[eureka-client-1.9.3.jar:1.9.3]
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$1.execute(EurekaHttpClientDecorator.java:59) ~[eureka-client-1.9.3.jar:1.9.3]
at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77) ~[eureka-client-1.9.3.jar:1.9.3]
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56) ~[eureka-client-1.9.3.jar:1.9.3]
at com.netflix.discovery.DiscoveryClient.register(DiscoveryClient.java:829) ~[eureka-client-1.9.3.jar:1.9.3]
at com.netflix.discovery.InstanceInfoReplicator.run(InstanceInfoReplicator.java:121) ~[eureka-client-1.9.3.jar:1.9.3]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_73]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_73]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_73]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [na:1.8.0_73]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_73]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_73]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_73]
需要在application.yml中注册客户端
eureka:
client:
service-url:
defaultZone: http://localhost:8111/eureka
5.改变application的注册名
spring:
application:
name: eureka
3-3 Eureka Client
1.新建项目(同上) Dependencies:Cloud Discovery:Eureka Discovery
2.入口类
@SpringBootApplication
@EnableDiscoveryClient
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
3.配置
server:
port: 8888
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
spring:
application:
name: eureka-client
注:server port 要修改,否则启动是可能会报错,
Invocation of destroy method failed on bean with name 'scopedTarget.eurekaClient': org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'eurekaInstanceConfigBean': Singleton bean creation not allowed while singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!)
3-4 eureka的高可用
1.有俩台eurekaService,可让他们互相注册
eurekaService1的配置
server:
port: 8761
eureka:
client:
service-url:
defaultZone: http://localhost:8762/eureka
register-with-eureka: false
#是否展示下线的客户端,自我保护模式(只能在生产环境关闭)
server:
enable-self-preservation: false
spring:
application:
name: eureka
eurekaService2的配置
server:
port: 8762
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
register-with-eureka: false
spring:
application:
name: eureka
eurekaClient的配置
server:
port: 8777
eureka:
client:
service-url:
defaultZone: http://localhost:8762/eureka
instance:
hostname: clientName
spring:
application:
name: eureka-client
这样,client的注册信息不仅能在eureka2中看见,也能在eureka1中看见,但当eureka2宕机时,client是无法注册的,所以可将lient端如下配置
server:
port: 8777
eureka:
client:
service-url:
defaultZone: http://localhost:8762/eureka,http://localhost:8761/eureka
instance:
hostname: clientName
spring:
application:
name: eureka-client
3-6 分布式下服务注册的地位和原理
1.注册中心相当于中间商。
2.服务发现的俩种方式:a从注册中心拿到一堆b的信息,然后通过某种机制(轮循,hash)也就是负载均衡机制,来找出一个b的ip地址,称为客户端发现;a通过代理拿到一个b的ip地址,称为服务端发现。
3.eureka是客户端发现,nginx,zookeeper,kubernetes是服务端发现
4.微服务的特点:异构(不同语言,不同类型的数据库)
4-1 微服务的服务拆分
1.微服务的起点和终点
单一应用架构----》垂直应用架构----》分布式服务架构----》流动计算架构
ORM MVC RPC SOA
2.业务上不适合上微服务的:系统中包含强事务场景的,传统应用使用本地事务和分布式事务保证数据一致性,但是在微服务架构中数据都是服务私有的,需要通过服务提供的API来访问,所以分布式事务不再适用微服务架构;业务相对稳定,迭代周期长;访问压力不大,可用性要求不高;
4-2 康威定律和微服务
1.任何组织在设计一套系统时,所交付的设计方案在结构上都与该组织的沟通结构保持一致。
4-3 点餐业务服务拆分分析
1.第一种:分为手机端和pc端
2.第二种:订单,商品,支付
3.服务拆分的方法论
扩展立方模型:x轴水平复制(通过副本扩展,实现应用程序的伸缩性和可用性)
z轴数据分区(每个服务器负责一个数据子集)
y轴功能解耦
4.拆功能:单一职责,松耦合(服务之间耦合度低,修改一个服务,不用导致另一个服务被修改),高内聚(相关的行为都聚集在一个服务器内部);关注点分离(按职责,通用性,粒度级别);
5.服务和数据的关系:先考虑业务功能,再考虑数据;