Eureka 2.0 闭源后,spring cloud 应该何去何从

Posted by NotGeek on May 21, 2020

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 ApplicationContext / BeanFactory

BeanFactoryFactoryBean 的区别


  • 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 推送消息过来,然后

成千上万的服务会直接 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

具体问题具体分析。