首页 文章 精选 留言 我的

精选列表

搜索[AI驱动],共10000篇文章
优秀的个人博客,低调大师

字节跳动宣布开源 KubeWharf,一个实践驱动的云原生项目集

字节跳动宣布正式开源 KubeWharf 项目。KubeWharf 是字节跳动基础架构团队在对 Kubernetes 进行了大规模应用和不断优化增强之后的技术结晶。这是一套以 Kubernetes 为基础构建的分布式操作系统,由一组云原生组件构成,专注于提高系统的可扩展性、功能性、稳定性、可观测性、安全性等,以支持大规模多租集群、在离线混部、存储和机器学习云原生化等场景。公告指出: “2016 年,字节跳动启用 Kubernetes 技术栈,开始对业务进行大规模容器化改造,到 2018 年,内部部署的容器单集群已经达到了上万个节点。时至今日,字节跳动实现云原生化的应用比例已超过 95%,我们计划和开源社区合作,逐步开放规模化云原生落地的工具和最佳实践。” 项目地址:https://github.com/kubewharf 开源背景介绍 以 Kubernetes 为代表的云原生技术底座支撑了字节跳动业务的快速发展。从微服务场景开始,Kubernetes 逐渐演化,统一支撑了字节内部的大数据、机器学习以及存储服务等多种形态基础设施。从 2018 年至今,字节跳动的 Kubernetes 节点的规模增长了 10 倍以上。面对这样的增速,提高 Kubernetes 分布式操作系统的性能、资源利用率、可扩展性、可用性等愈发重要,KubeWharf 就是在这样的背景下诞生。 KubeWharf 第一批计划开源三个项目 : 高性能元信息存储系统 KubeBrain kube-apiserver 七层网关 KubeGateway 轻量级多租户方案 KubeZoo KubeWharf 首批开源项目 KubeBrain Kubernetes 是典型的中心化架构,元信息存储的性能对于集群的可扩展性和稳定性至关重要。在字节使用 Kubernetes 的过程中,随着集群规模增大到 1w 节点左右,etcd 逐渐成为制约集群可扩展性的瓶颈,经常出现读写延迟增高、OOM 等问题。 在分析了 etcd 的性能瓶颈和 Kubernetes 对于状态信息存储的需求之后,字节跳动基础架构团队自研了 KubeBrain,代替 etcd 作为 Kubernetes 的元数据存储系统,旨在提高 Kube-APIServer 存储的读写性能,增强集群稳定性。 下面是 KubeBrain 的一些特性: 高性能:通过读写逻辑的优化与底层存储引擎的改良,读写性能相较 etcd 有明显优势,且有效降低了 OOM 的风险。 无状态:KubeBrain 作为一个实现 API Server 所需要使用的存储服务端接口的组件进行存储接口的转换并不实际存储数据,实际的元数据存放在底层的存储引擎中,而 API Server 所需要监听的数据存放主节点内存中。 扩展性:KubeBrain 抽象了键值数据库接口, 在此基础上实现存储 API Server 存储所需要使用的接口,具有指定特性的键值数据库均可适配存储接口。 高可用:KubeBrain 当前采用主从架构,主节点支持包括条件更新、读、事件监听在内所有操作,从节点支持读操作,基于 leader election 进行自动选主,实现高可用。 兼容性:兼容 etcd 接口,Kubernetes 可以无缝快速接入。 水平扩容:生产环境下,KubeBrain 通常使用分布式键值数据库存储数据,水平扩容包含两个层面: 在 KubeBrain 的层面,可以通过增加从节点提高并发读性能 在存储引擎层面,可以通过增加存储节点等手段提高读写性能和存储容量 KubeGateway kube-apiserver组件是 Kubernetes 集群的所有外部请求访问入口,以及 Kubernetes 集群内部所有组件的协作枢纽。在使用 Nginx 做APIServer的四层负载均衡器时,由于 client 和APIServer通过 HTTP2 连接,容易造成负载不均衡,在 APIServer 重启后不均衡更为明显。同时,缺乏灵活的请求路由和治理能力,无法进行精细化的 API 流量控制。 KubeGateway 是为 kube-apiserver 的 HTTP2 流量专门设计并定制的七层负载均衡代理,目标是为大规模 Kubernetes 集群的 kube-apiserver 提供更灵活的稳定的流量治理方案。 下面是 KubeGateway 的一些特性: 负载均衡:为多个 kube-apiserver 进行请求级别的负载均衡,取代之前“连接级别”的负载均衡,使 apiserver 层可以做到真正意义上的水平扩展。 请求治理:为 kube-apiserver 提供流量特征定制的路由规则,可以通过 verb、apiGroup、resource、user、userGroup、serviceAccounts、nonResourceURLs 等信息来区分请求,进行差异化转发,可以满足将 Pod 和 Node 的请求分开处理、 apiserver 灰度升级等场景的需求。 连接复用:通过 HTTP2 连接复用,能收敛单个 kube-apiserver 实例上的 TCP 连接数,降低至少一个数量级。 配置热更新:路由等配置实时生效,不需要重启服务。可以避免使用 Nginx 时由于配置变更滚动升级导致所有连接都需要断开重连的问题。 网关能力:具备动态服务发现、限流、降级、熔断、缓存、黑白名单等网关能力。 KubeZoo 社区现有的 Kubernetes 多租户方案各有其适用场景,但在租户体验,集群资源效率以及运维成本方面尚存在改进空间:基于 NameSpace 的多租户方案会把租户约束在特定的 NameSpace 下,租户无法自由使用 CRD、NameSpace 等集群级别的资源;基于 cluster 或 controller plane 隔离的多租户方案面临着资源利用率低,运维成本偏高等问题。 KubeZoo 是一个轻量级的 Kubenertes 多租户项目,基于协议转换的核心理念在一个物理的 K8s 控制面上虚拟出多个控制面,它具有以下特点: 资源消耗低:和租户独占集群或者 Master 控制面对比,KubeZoo 只需要一个“网关”,无需为每一个租户起一个独立的控制面集群,资源消耗很少。且租户数量越多,资源消耗方面的收益更加显著。 控制面隔离性高:每个租户可以拥有独立且完整的 Kubernetes 集群视图,租户既可以使用 namespace scope 的资源,又可以使用 cluster scope 的资源,使用体验好。 运维成本低:KubeZoo 有效的减少了集群/ Master 管控面的数量,大大减少了运维、升级维护成本。 高效率:秒级创建租户,每个租户的集群创建相当于创建一个 Tenant 对象,省略了耗时的硬件资源分配和控制面初始化过程。 项目 RoadMap 目前 KubeWharf 开源了第一批的三个项目。字节方面表示,他们计划在未来进一步推动其走向完善: 结合内外部用户需求,持续迭代已经开源的项目。在 KubeBrain 项目上,持续增强稳定性、性能和易用性,探索多点写架构设计。在 KubeGateway 项目上,进一步完善 apiserver 的网关能力,并且尝试基于网关聚合的多 K8s 集群透明联邦。在 KubeZoo 项目上,结合 Virtual Kubelet / Kata 等技术探索公有云 Serverless Kubernetes 产品形态。 继续开源其他内部项目。我们会开源更多 Kubernetes 生态的项目,如在离线统一的高性能分布式调度器、混部管控系统等。以这些有差异化竞争力的云原生组件与技术为基础,推出 Kubernetes 发行版,持续输出在大规模多租集群、混部、大数据等关键场景的解决方案与最佳实践。 “我们也希望通过开源,输出云原生关键场景下更丰富的解决方案和最佳实践,对上游社区做出更多贡献,为云原生开发者提供工具、参考和新思路。” 相关项目: KubeWharf: https://github.com/kubewharf KubeBrian:https://github.com/kubewharf/kubebrain KubeGateway:https://github.com/kubewharf/kubegateway KubeZoo:https://github.com/kubewharf/kubezoo

优秀的个人博客,低调大师

Spring注解驱动开发之十——@Resource、@Inject 自动注入、Aware接口、@Profile环境配置

本文包含以下内容: @Resource、@Inject 自动注入 @Autowired标注方法、构造器、参数 实现Aware 获得Spring 的底层组件 通过@Profile配置不同的环境 1.@Resource、@Inject 自动注入 1)通过 @Resource 进行Bean 注入到容器 @Resource 为 JSR250 规范中提出的,可以实现@Autowired 一样的自动装配的功能,但是, 不支持@Primary ,默认优先注入和@Autowired(reqiured=false) 运行不注入2个功能,下面开始测试: 修改bookService 中,在开启bookDao2 和 @Repository 的前提下, @Resourceprivate BookDao bookDao; 测试结果1,不设置指定的Bean id: ,默认注入了 @Repository 的Bean, 注入了lable 为2 的Bean 可以在里面指定注入Bean 的id ,如下代码所示: @Resource(name="bookDao2")private BookDao bookDao; 测试结果2 , 指定注入Bean 的id ,注入了lable 为2的Bean: 2)通过@Inject 注入到容器 @Inject是 JSR330 规范中的注解,功能跟@Autowired 功能一致,不过需要额外引入 javax.inject 依赖 引入依赖: <!-- https://mvnrepository.com/artifact/javax.inject/javax.inject --><dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version></dependency> 修改BookService中的引入 @Injectprivate BookDao bookDao; 获得测试结果,成功注入lable为1 的Bean 添加 @Primary指定lable 为2 的Bean 为优先注入,即可获得如下结果: @Primary@Bean("bookDao2")public BookDao bookDao(){ BookDao bookDao = new BookDao(); bookDao.setLable("2"); return bookDao;} 2.@Autowired标注方法、构造器、参数 除了上篇文章中的@Autowired 使用方法,@Autowired 还可以标注在 方法、构造器、参数上,进行注入,下面将进行测试 建立创建Car @Componentpublic class Car { public Car(){ System.out.println("car constructor..."); } public void init(){ System.out.println("car ... init..."); } public void detory(){ System.out.println("car ... detory..."); }} 在Boss 中引入Car //默认加在ioc容器中的组件,容器启动会调用无参构造器创建对象,再进行初始化赋值等操作@Componentpublic class Boss {privateCarcar;} 1)标注在 方法上: @Autowired public void setCar(Car car) { this.car = car; } 编辑测试方法 Boss boss = applicationContext.getBean(Boss.class);System.out.println(boss);Car car = applicationContext.getBean(Car.class);System.out.println(car); 获得测试结果,可以看到容器内的Car 和Boss 上的Car 是指向同一个内存地址,即同一个对象。 2)标注在 构造器、参数上 方式一:自动忽略不填写(只有一个构造方法且为有参的) public Boss(Car car){ this.car = car; System.out.println("Boss...有参构造器");} 方式二:加在参数上 public Boss(@Autowired Car car){ this.car = car; System.out.println("Boss...有参构造器");} 方式三:加在构造方法上 @Autowiredpublic Boss(Car car){ this.car = car; System.out.println("Boss...有参构造器");} 上面3种方式,测试结果如下:都会自动注入容器中的Car,可以看到内存地址 一致。 3)配合 @B ea n标注在 有参的构造 ,可以 方式一:省略参数上的@Autowired @Beanpublic Color color(Car car){ Color color = new Color(); color.setCar(car); return color;} 方式二:不省略的情况 @Bean public Color color(@Autowired Car car){ Color color = new Color(); color.setCar(car); return color;} 添加测试方法 Color color = applicationContext.getBean(Color.class);System.out.println(color);System.out.println(applicationContext);applicationContext.close(); 获得测试结果如下,可以看到Color 中的Car 跟容器的的Car是一致的 3.实现Aware 获得Spring 的底层组件 Spring 中可以通过实现 XXXAware 接口,实现对应的方法,可以获取到Spring 底层的一下 组件,下面将对Aware 接口进行测试: 查看源码描述: 可以看到: Marker superinterface indicating that a bean is eligible to be notified by the Spring container of a particular framework object through a callback-style method. spring 框架会通过 回调方法。下面以 ApplicationContextAware 、BeanNameAware 、EmbeddedValueResolverAware为例测试 1.)ApplicationContextAware实现setApplicationContext获取到 ioc 容器 @Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException { // TODO Auto-generated method stub System.out.println("传入的ioc:"+applicationContext); this.applicationContext = applicationContext;} 2.) BeanNameAware 获取到当前 容器的名称 @Overridepublic void setBeanName(String name) { // TODO Auto-generated method stub System.out.println("当前bean的名字:"+name);} 3.) EmbeddedValueResolverAware 获取到 字符串解析器 ,既可以跟@Value 中一样可以解析基本类型、#{}、${} 等 @Overridepublic void setEmbeddedValueResolver(StringValueResolver resolver) { // TODO Auto-generated method stub String resolveStringValue = resolver.resolveStringValue("你好 ${os.name} 我是 #{20*18}"); System.out.println("解析的字符串:"+resolveStringValue);} 获得测试结果如下: 4.通过@Profile配置不同的环境 在Spring 中,可以通过@Profile 指定 当前运行环境,如项目开发中的流程开发、测试、生产的环境,采用不同的 配置文件等信息,如数据库文件目录等信息。下面开始测试: 1.)添加数据库依赖,和c3p0 依赖 <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version></dependency><dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.44</version></dependency> 2.)建立配置文件 dbconfig.properties db.user=rootdb.password=123456db.driverClass=com.mysql.jdbc.Driver 3.)建立新的配置类, 引入配置文件 @PropertySource("classpath:/dbconfig.properties")@Configurationpublic class MainConfigOfProfile implements EmbeddedValueResolverAware{ @Value("${db.user}")privateStringuser; private String driverClass; @Override public void setEmbeddedValueResolver(StringValueResolver resolver) { // TODO Auto-generated method stub driverClass = resolver.resolveStringValue("${db.driverClass}"); }} 4.)建立配置类Bean @Bean("testDataSource")public DataSource dataSourceTest(@Value("${db.password}")String pwd) throws Exception{ ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setUser(user); dataSource.setPassword(pwd); dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test"); dataSource.setDriverClass(driverClass); return dataSource;}@Bean("devDataSource")public DataSource dataSourceDev(@Value("${db.password}")String pwd) throws Exception{ ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setUser(user); dataSource.setPassword(pwd); dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/ssm_crud"); dataSource.setDriverClass(driverClass); return dataSource;}@Bean("prodDataSource")public DataSource dataSourceProd(@Value("${db.password}")String pwd) throws Exception{ ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setUser(user); dataSource.setPassword(pwd); dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/scw_0515"); dataSource.setDriverClass(driverClass); return dataSource;} 5.)建立测试方法, public class IOCTest_Profile { //1、使用命令行动态参数: 在虚拟机参数位置加载 -Dspring.profiles.active=test //2、代码的方式激活某种环境; @Test public void test01(){AnnotationConfigApplicationContextapplicationContext=newAnnotationConfigApplicationContext(MainConfigOfProfile.class); String[] namesForType = applicationContext.getBeanNamesForType(DataSource.class); for (String string : namesForType) { System.out.println(string); } }} 7.)可以看到运行结果如下,没有配置任何的环境, 所有Bean 都会注入进来 8.)在对应的Bean 上加上指定环境的注解 @Profile("test")@Bean("testDataSource")@Profile("dev")@Bean("devDataSource")@Profile("prod")@Bean("prodDataSource") 9.)运行可以看到, 没有注册任何的Bean 10.) 使用default,会默认创建该Bean跟不标注 @Profile的效果是一致的 @Profile("default")@Bean("devDataSource") 11.)获得测试结果 12.)修改当前生效环境有 2种方式 方式一:通过启动添加 JVM 启动参数 -Dspring.profiles.active=test 方式二,通过代码形式,注册容器时,不使用带参数的 构造方法进行注册 AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();//1、创建一个applicationContext//2、设置需要激活的环境applicationContext.getEnvironment().setActiveProfiles("dev");//3、注册主配置类applicationContext.register(MainConfigOfProfile.class);//4、启动刷新容器applicationContext.refresh(); 测试结果如下,也能获取到 指定环境的值 -END- 可以关注我的公众号,免费获取价值1980元学习资料 点击“在看”,学多少都不会忘~ 本文分享自微信公众号 - 阿聪的全栈之路(gh_ffab7c84fb0c)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

Spring注解驱动开发之八——@Value属性赋值、@PropertySource 加载外部配置文件

本文包含以下内容: 建立新的配置类 建立新的测试方法 通过@Value 进行赋值 通过@PropertySource 加载配置文件,并进行注入 拓展@Value、@PropertySource 1.建立新的配置类 建立新的配置类, @Configuration指定为配置类,@Bean加载Person类,为测试做准备,代码如下: @Configurationpublic class MainConfigOfPropertyValues { @Bean public Person person(){ return new Person(); }} 2.建立新的测试方法 建立测试方法,获取并打印Person 的Bean public class IOCTest_PropertyValue { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfPropertyValues.class); @Test public void test01(){ printBeans(applicationContext); System.out.println("============="); Person person = (Person) applicationContext.getBean("person"); System.out.println(person); } private void printBeans(AnnotationConfigApplicationContext applicationContext){ String[] definitionNames = applicationContext.getBeanDefinitionNames(); for (String name : definitionNames) { System.out.println(name); } }} 测试类运行结果如下,可以看到默认情况下person 这个Bean 所有的字段都为空。下面将进行赋值 3.通过@Value进行赋值 在xml配置文件可以通过bean 标签中包含 property进行属性赋值 <bean id="person" class="com.atguigu.bean.Person" scope="prototype" > <property name="age" value="18"></property> <property name="name" value="zhangsan"></property> </bean> 在注解开发中可以使用@Value 对属性进行赋值。 其中可以赋值 1.基本数据类型 @Value("张三")private String name; 2.可以写SpEL;#{},即sping 的表达式 @Value("#{20-2}")private Integer age; 3.可以写${};取出配置文件【properties】中的值(在运行环境变量里面的值) @Value("${person.nickName}")private String nickName; 运行结果如下,成功赋值 4.通过@PropertySource 加载配置文件,并进行注入 在xml 配置文件时,可以通过 context :property-placeholder标签,引入配置文件。 <context:property-placeholder location="classpath:person.properties"/> 1.在注解开发中,可使用 @PropertySource 加载外部配置文件 @PropertySource(value={"classpath:/person.properties"}) 2.创建属性文件 person.properties person.nickName=小李四 即可通过@Value + ${}获取到配置的文件的值,或使用容器的 getEnvironment()方法进行调用 getProperty( "person.nickName" );获取配置文件中的内容。 ConfigurableEnvironment environment = applicationContext.getEnvironment();String property = environment.getProperty("person.nickName");System.out.println(property); 添加测试运行结果如下: 5.拓展@Value 、@PropertySource @Value静态变量赋值 在处理静态变量时候,使用上面的@Value的用法是无法获取到配置文件中的数据的,只能获取到null,所以要进行如下更改。 @PropertySource注解的地址可以是以下两种: classpath路径:"classpath:/com/myco/app.properties" 文件对应路径:"file:/path/to/file" -END- 可以关注我的公众号,免费获取价值1980元学习资料 点击“在看”,学多少都不会忘~ 本文分享自微信公众号 - 阿聪的全栈之路(gh_ffab7c84fb0c)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册