Eureka 2.0 闭源后,Spring Cloud 该何去何从?
TOC
[TOC]
Spring Cloud 的特性?
1. Features
Spring Cloud focuses on providing good out of box experience for typical use cases and extensibility mechanism to cover others.
- Distributed/versioned configuration
- Service registration and discovery
- Routing
- Service-to-service calls
- Load balancing
- Circuit Breakers
- Distributed messaging
Cloud Native Applications
就是一个开发的范式
Cloud Native
- 根上下文: Bootstrap Application
- 配置
- 子上下文: Spring Boot ApplicationContext
- 配置
- Beans 是多层的
- 多层的事件管理
- 多层 Message 管理
- 子上下文: Spring Boot ApplicationContext
类似于双亲委派来进行多层次的加载
Spring ApplicationContext
/ BeanFactory
BeanFactory
和 FactoryBean
的区别
-
BeanFactory
管理 Bean 以及塔的生命周期,Spirng Bean 容器 -
ApplicationContext
- 子接口
ConfigurableApplicationContext
BeanFactory
ListableBeanFactory
HierachicalBeanFactory
层次性的- parent: 5 beans
- current: 3 Beans
- 事件/监听 (
ApplicationEventPublisher
) - 资源管理(
ResourceLoader
)
- 子接口
bootstrap.yml
Application Context Hierarchies
多层次上下文的描述,Spring Cloud 官网
1
2
3
4
5
6
7
8
@SpringBootApplication
public class EurekaClosedSourceApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClosedSourceApplication.class, args);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class ApplicationContextDemo {
public static void main(String[] args) {
// 设置 父上下文
AnnotationConfigApplicationContext parentContext = new AnnotationConfigApplicationContext(SuperUser.class);
// 构建一个注解驱动的应用上下文
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.setParent(parentContext);
// 注册 UserConfiguration -》 User
context.register(UserConfiguration.class);
// 启动 Spring 应用上下文
context.refresh();
System.err.println(context.getBean(UserConfiguration.class));
System.err.println(context.getBean(User.class));
// 当前上下文 -> 找不到 -> parent 上下文
// Spring MVC -> ContextLoaderListener -> Root WebApplicatin
// Spring MVC -> DispatcherServlet -> Servlet WebApplication -> Parent == Root WebApplication
// <context-param> -> XML 文件,娶不到 dispatcher-servlet.xml
// 父获取子的,自然取不到。
// Bootstrap ClassLoader 完全无法感知 子 ClassLoader
System.err.println(context.getBean(SuperUser.class));
// 关闭 Spring 应用上下文
context.close();
}
@Configuration
public static class UserConfiguration {
@Bean
public User user() {
return new User();
}
}
}
Changing the Location of Bootstrap Properties
- 上下文的配置,进行 merge
自定义
配置
外部化
调整 层次性
META-INF/spring.factories
Environment Changes
Environment 抽象, Spring Boot 里边
Spring 总是喜欢用 Rest 的方式来做。不一定是 config 的 Spirng Boot 服务,
Encryption And Decryption
加密和解密
Endpoints
Spring Cloud Commons : Common Abstractions
可以完全的自定义。
服务可以自动的注册。
Spring RestTemplate LoadBlance 可以负载均衡
1 2 3 4 5 6 7 8 @Configuration public class MyConfiguration { @LoadBalance @Bean RestTemplate restTemplate() { return new RestTemplate(); } }
没有负载均衡怎么办?
重试策略也可以来做,就是最大次数怎么来做。?就相当于拦截?
RestTemplate
在 Spring Cloud 类似于泛化调用?
/{application}/{profile}/{label}
Spring Cloud 莫名的会出现类名找不到。
Spring Cloud Config Server
Environment Repository
{application}
应用{profile}
配置化条件{label}
应用/区域/配置化条件/
Git Backend
Docker 是一个不变的镜像,那么 Git 放上去,到底是变还是不变?变得化,存在哪里?
Authentication
认证,Git 配置中心 的认证
镜像要是做映射管理,还是特别麻烦的。
Health Indicator
是一个健康检查,
特性:
- 粗粒度: OK
- 细粒度:JDBC,配置中心怎么杨
application.yml
1 2 passowrd: '{cipher}DASFASDFASDFA'
Enabedding the Config Server
内置化的 Config Service
Push Notifications and Spring Cloud Bus
配置中心的推送以及分布式消息的推送
假如说
- Config 出现改变的时候,
- Config Server 感知到了。
- 每个子服务 Config Client 需要轮询,感知
- 应用多的化,会把 服务给搞崩了
- Cloud Bus 推送消息过来,然后
- 每个子服务 Config Client 需要轮询,感知
- Config Server 感知到了。
成千上万的服务会直接 hang 掉。
拆分可以解决并发的问题,不可以解决内存的问题。进行全量列表的拉取问题。
ZooKeeper 可以用 Master/Slave 进行读写分离,
可以设置多长时间感知一下,但是时间设置太短,会对机器造成损耗。
如果要做 网关的化,是否需要把 Eureka 的所有的注册列表全部拉过来?
@EnableEurekaClient
可以用 @EnableDiscoverClient
代替
Spring Cloud 的 Commons API 比较好。
Zuul 为什么不好用?
就是一个 Servlet ,Filter
- ZuulProxy
- ZuulServer
zuul 比较麻烦,只能做一半,ssl 在 Tomcat 里边配置证书。
zuul 效率比较低,依赖于 链接数多少个,没有实现 异步化。
- Zuul 的配置没有办法再次重新加载
- nginx 可以修改。
zuul 尽量是走回头路。
zuul 是对外的。
Zuul 有 Grovy 的方式。还有很多问题。
Nginx 采用了 多工的方式
- nginx 可以进行重启
nginx 可以配合内部的 IP 来做的。
KONG 的方式
- DNS 的方式
- IP 的方式
携程的方式
java 会公用 ThreadLocal
具体问题具体分析。