SpringCloud微服务学习

一、微服务选型

微服,最近非常流行;Spring Clound 和Dubbo。

  • Dubbo (Double读法) RpC 只是实现了服务治理(注册 发现等)
  • Spring Cloud下面有很多个子项目覆盖了微服务架构下的方方面面

1.1 微服务优点

  • 开发相对简单
  • 技术栈灵活 (微服务:技术栈很灵活,不同的功能用不同的语言实现;)
  • 服务独立解耦
  • 可用性高

参考链接:Spring Cloud中文网
参考链接:Spring Cloud中文学习指南
参考链接:程序员DD didispace
参考链接:51cto周力 2016年Spring Cloud微服务实战视频课程周立博客
参考链接:大师-Zhangxd-Spring boot Cloud
参考链接:Spring For All社区
参考链接:泥瓦匠BYSocket的博客
参考链接:KL博客
参考链接:老卫的博客
参考链接:✋ - 4小时使用SpringCloud框架实现慕课网主页后端开发
参考链接:✋ - SpringCloud Finchley三版本(M2+RELEASE+SR2)微服务实战 收藏

1.2 微服务缺点/挑战

  • 维护和部署复杂度的增加,需要专门运维干。
  • 服务间通信成本
  • 数据一致性(分布式事物)
  • 系统集成测试

二、SpringCloud框架

专注服务的治理、熔断、监控,最高频的有Eurkeka、Zuul、Fegin、Hystrix

持续交付&容易部署

2.1 Eureka

服务的注册和服务的发现,服务治理的核心组件。

Eureka Server 和 Eureka Client

Eureka Server简称Eureka,使用两层的Map保存原信息。ConcurrentHashMap<String,<Map<String,Lease<InstanceInfo>>>>第一个string,是应用名称;第二个map保存的时候示例的名称,每个应用有多个实例。第二个Map string是实例的名称, value是实例的详细信息:ip、端口号、状态等等。

2.2 Zuul

系统中有多个微服务,但是请求方不可能记住所有的服务地址。Zuul做请求分发,统一入口。网关的作用。

详细介绍

Zuul是一个Api Geteway服务器,本质上是一个Web Servlet应用。提供动态路由、监控等服务、核心是一系列过滤器,经常需要自己定义过滤器。

http请求reqeust到response有很多过滤器,至少有四种
+ pre filters: 请求路由之前,记录调试信息,身份验证。
+ routing filter: 路由到实际的服务器,可能error 
+ post filters: 请路由之后,用来添加统一的http response头,收集统计信息和指标、把响应从微服务发给客户端。
+ custrom filtes:
+ error filters:  

2.3 Feign

微服务之间需要互相调用,用来简化互相调用的复杂度。封装了http restful调用,想调用本地方法一样,调用其他微服务。
Ribbon和Feigin;

2.3.1 Ribbon

客户端的负载均衡器,提供负载均衡算法、app_name到具体ip抓换。微服务,每服务提供这都有多台服务器,这里就牵扯调用那一台具体服务器的算法和服务name到ip的转换。算法有:轮训、最小请求数量。

2.3.2 Feigin

简化Http的操作,我们只需要定义接口,加上注解。默认Feign是依赖整合了Ribbon和Hystrix,操作就更简单。

2.4 Hystrix

服务之间调用,互相依赖,调用控制,调用延迟控制,用来解决依赖故障容错、降级处理,提高系统稳定性和可用性。

熔断器的核心问题

解决服务雪崩的问题。三个特性
+  断路器机制:当Hystrix Command请求后端服务器失败数量超过一个阀值比例(默认50%),断路器切换到开路状态。对请求失败传播的控制。 断路器开启,所有请求直接失败,不在请求后端服务器。 
+  Fallback: 降级回滚策略,兜底操作。万一依赖放,不可用,如何处理,不能给客户返回系统错误,太不友好了。我们可以返回空的,或者之前缓存数据。
+  资源隔离:不同的微服务使用不同线程池管理。A服务出问题,不会影响B。

三、微服务开发

 良好的系统重用
 良好的功能拆分,降低系统耦合 	

3.1 Euraka启动

bootstrap.yml加载优先与application.yml
Euraka多实例高可用版本,启动说明,Euraka规定的配置文件,hostname和defaultZone多实例不能相同。

3.1.1 本机host修改

sudo vim /etc/hosts

```java
127.0.0.1 server1
127.0.0.1 server2
127.0.0.1 server3
```

3.1.2 打包jar

+ 找到父工程,根目录,执行:`mvn clean package -Dmaven.test.skip=true -U`, 不执行测试用例,-U强制执行。 这里打包,所有子项目都会进行打包。
+ java -jar xxx.jar 执行:`java -jar xxx.jar --spring.profiles.active=server1`, 指定profiles进行启动,三台euraka都进行启动。 `platform-eureka-1.0-SNAPSHOT.jar`
+ server1和server2启动的时候,可能会报错,正常,server1启动的时候没有找到另外两个server。启动示例:
	- `java -jar platform-eureka-1.0-SNAPSHOT.jar  --spring.profiles.active=server1`、
	- `java -jar platform-eureka-1.0-SNAPSHOT.jar  --spring.profiles.active=server2`、
	_ `java -jar platform-eureka-1.0-SNAPSHOT.jar  --spring.profiles.active=server3`、
+ 访问:`curl http://localhost:8000`
发布了114 篇原创文章 · 获赞 87 · 访问量 35万+

猜你喜欢

转载自blog.csdn.net/ab601026460/article/details/104156214