首页 文章 精选 留言 我的

精选列表

搜索[企业级],共10000篇文章
优秀的个人博客,低调大师

JBoss企业级应用服务平台群集指南(二)

1.1.2服务架构 每个节点上的ClusterPartition MBean定义的群集拓扑结构(clustering topography)对系统管理员很重要。但是对于大部分的应用程序开发者来说,你可能更关心从客户应用程序的角度来看的群集架构。JBossAS支持两种群集架构:客户端拦截器(client-side interceptors)(proxies或stubs)和负载平衡系统(load balancers)。 1.1.2.1客户端拦截器 JBoss 应用服务器提供的大部分远程服务,包括JNDI、EJB、RMI和JBoss Remoting,都要求客户端获得(如,查找和下载)一个stub(或proxy)对象。占位对象(stub object)由服务器生成,它实现服务的商业接口。客户可对占位对象调用本地方法。这个调用会自动寻找路由,并被服务器管理的服务对象引用。在群集环境里,服务器生成的占位对象也是一个懂得怎样把调用指引向不同节点的拦截器。占位对象寻找合适的服务器节点、配置调用参数、解释调用结果,并把结果返回给调用程序。 stub interceptors 拥有群集系统的更新信息。例如,它们知道所有可用网络节点的IP地址,怎样在节点上分摊负载的算法(请参考下一部分内容),和如果目标节点不可用时对请求进行失效切换(failover)。对于每个服务请求,服务器节点都用群集里最新的信息来更新stub interceptor。例如,如果一个节点退出群集系统后,每个客户stub interceptor在下一次连接活动的节点时,都会用新的配置来更新。在service stub上的所有操作对于客户应用程序都是透明的。 如图1.2,“集群中的客户端拦截(代理)体系结构” 里说明了客户端拦截器群集架构。 图1.2.集群中的客户端拦截(代理)体系结构 1.1.2.2负载平衡系统 其他的JBoss服务,特别是HTTP web服务,不要求客户下载任何东西。客户端(如,web浏览器)按照某种通信协议(如HTTP协议)直接发送请求和接收回复。在这种情况下,负载平衡系统需要处理所有的请求并把它们分配给群集里的服务器节点。负载平衡系统是群集里的一个典型概念。它理解群集配置和失效切换策略(failover policies)。客户只需要知道它的存在。如图1.3,“集群的负载均衡体系” 说明了负载平衡系统的群集架构 。 图1.3.集群的负载均衡体系 负载平衡本身就是一个单点故障,这对于负载均衡是一个潜在的问题。它需要受到密切的监控,以确保高可用性的集群服务。 本文转自xudayu 51CTO博客,原文链接:http://blog.51cto.com/xudayu/64784,如需转载请自行联系原作者

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

企业级高可用Web架构之HAProxy+Keepalived

细数下来,算是东莞的项目的话,HAProxy+Keepalived我差不多也有三套在线上跑了,另外,这套Web方案也是我的一拍网的备份方案之一,目前也在测试,如果速度和稳定性够强劲的话,我也考虑将LVS+Keepalived换成HAProxy+Keepalived,关于HAProxy的语法和安装步骤请参考我的专题系列文章http://network.51cto.com/art/201101/241997.htm,另外,此篇文章跟刘天斯的不一样,我主要用其作为Web级别的负载均衡(七层应用)。 一、线上跑的HAProxy配置文件,代码如下: 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 global log 127.0.0.1 local0 maxconn 65535 chroot /usr/local/haproxy uid 99 gid 99 daemon nbproc 8 pidfile /usr/local/haproxy/haproxy .pid #debug defaults log 127.0.0.1 local3 mode http option httplog option httpclose option dontlognull option forwardfor option redispatch retries 2 maxconn 2000 balance source stats uri /web-status contimeout 5000 clitimeout 50000 srvtimeout 50000 listen www.1paituan.com bind *:80 mode http option httplog log global option httpchk HEAD /index .jsp HTTP /1 .0 server web1 203.93.236.147:80 weight 5 check inter 2000 rise 2 fall 3 server web2 203.93.236.146:80 weight 3 check inter 2000 rise 2 fall 3 二、HAProxy的监控脚本我没有做,因为生产环境下HAProxy宕机的可能性微乎其乎,这个实施起来也简单,我们可以用如下命令来监控,判断是否返回了正常的200代码,命令下所示: 1 curl -s -- head http: //www .1paituan.com /index .jsp | awk '/HTTP/ {print $2}' 三、加上日志支持,代码如下: 1 2 3 4 5 6 7 8 vim /etc/syslog .conf 添加: local3.* /var/log/haproxy .log local0.* /var/log/haproxy .log vim /etc/sysconfig/syslog 修改: SYSLOGD_OPTIONS= "-r -m 0" service syslog restart 四、大家需要注意的几个地方是: 1)HAProyx采用的是balance source机制,它跟Nginx的ip_hash机制原理类似,是让客户机访问时始终访问后端的某一台真实的web服务器,这样让session就固定下来了; 2)option httpchk HEAD /index.jsp HTTP/1.0 是网页监控,如果HAProxy检测不到Web的根目录下没有index.jsp,就会产生503报错。 3)有网友说HAProxy必须采用listen 203.93.236.141:80这样类似的格式,这样其实不好,做集群时会导致从机启动不了,我们可以用bind *:80的方式代替。 4)HAProxy的并发监控和日志收集分析是下一步考虑的事情。 本文转自 抚琴煮酒 51CTO博客,原文链接:http://blog.51cto.com/yuhongchun/669491,如需转载请自行联系原作者

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

企业级SaaS常用的三种加密方式

区别于传统软件的一个显著特点是,SaaS强调的是一种共享方式的软件应用程序,这种共享即包括用户之间的共享,也包括用户和SaaS企业之间的“共享”。由于法律和商业道德的约束,为你服务的企业可能永远不会偷看你的数据,但你仍然需要知道,你的数据是怎么被加密的。 很多综合SaaS和PaaS功能的文件存储和备份应用程序中都会为用户提供一个客户端的应用程序。这样的程序会在你发送数据至外部服务器(可能是你自己的,也可能是别人的)之前加密你的数据。并且会给你生成一个秘钥,只有你自己知道并自行管理的秘钥。 数据备份公司多备份在这方面的做法可以作为一个例子:数据从客户端接入数据后,立即进行AES256加密,加密后的数据分布在云存储中,而加密用的密钥则是在安装过程中,由客户端产生并由用户自己保存下来。 第二种方式是使用你自己的软件在发送至互联网之前进行本地加密。但由于这种加密方式需要针对不同的文件或软件做不同的应用,所以管理难度很大,导致具体的应用范围很小。 第三种方式则是使用某种基于网络的加密代理。当企业不完全信任他们供应商时,大多会转而寻求这种解决方案。有专家指出:被置于网络上的代理模式,如同一个网络网关一样运行。当用户访问SaaS网站时,他们通过代理重定向。该代理依赖于SaaS应用程序和拦截网页关键组成域的深厚知识。在发送至供应商之前,加密位于这些域的敏感数据,而在发送回用户前,将其解密。 对于用户来说,看上去就如同访问服务,只要他们在网络上使用代理。但是,如果他们试图通过直接连接至SaaS应用程序访问客户账户号码,他们所看到 的一切将是加密数据。对于不提供如你所需细粒度的访问控制服务,你可以对用户屏蔽数据并获得超过应用程序内部控制的安全性。此外,你可以在云计算中技术上 托管代理本身以支持远程访问。 作为云计算领域最重要的落地应用,SaaS(软件即服务)提供了最低程度的洞察力和控制力。SaaS安全涉及非常多的内容,其中包括身份管理、内部安全设置和角色管理、事件响应、审计规划等等,对于SaaS本身的加密也已经成为一种必备因素,所以不管是企业还是个人用户,但是你的第一个尝试应该是找一个你所信任的供应商,并基于自己的实际情况。 本文作者:程小微 来源:51CTO

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

《企业级ios应用开发实战》一3.3 MVC模式

3.3 MVC模式 MVC模型是应用程序设计者们普遍采用的一种设计模式,在第2章介绍Cocoa Touch框架时曾简单介绍了MVC。MVC模式把应用程序GUI代码根据功能拆分为不同的类或组件:“模型”:用于封装应用程序的数据;“视图”:负责显示和编辑数据:“控制器”:负责处理前两者之间的逻辑关系。它们之间的逻辑关系参考第2章的图2-3。Cocoa Touch本身也遵循MVC模型原则。在MVC模型下,3个层次都由截然不同的类来实现,编写任何类的代码都应当明显地归为其中一类,并且其大部分功能代码不应当属于另外两类。这种分工负责的方式使得程序易于设计、实现和维护。一般情况下,我们会在Interface Builder中创建视图组件(关于Interface Builder的使用,我们会在第5章中进行介绍)。或者,使用Xcode通过代码的方式继承已有的视图和控件。模型负责保存应用程序数据,通常我们使用Objective-C对象或者Core Data来构建模型组件。控制器组件可以使用UIKit控件中的ViewController及其子类,或者是完全由程序员自已定制的类。从第4章开始,我们将开始在iOS应用程序开发中逐步应用MVC模型的基本理论来构建应用程序框架。始终遵循MVC模型的基本理论,将有助于你创建出更加简洁、易于维护的代码。

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

《企业级ios应用开发实战》一3.5 块编程

3.5 块编程 C语言的运行时特性中包括了块,标准C工作组的 N1370: Apple’s Extensions to C 中(其中也包括垃圾回收)对块进行了定义。作为C语言的扩展,Objective-C在OSX 10.6及iOS 4.0以后支持块语法。块运行时也会被集成到LLVM的compiler-rt子项目存储库中。 3.5.1 块的特点 一些面向对象的动态语言如ruby、groovy,都提供了对块的支持(在groovy中,块被称作为闭包“closure”)。块是用一对{}括号括起来的多个语句的集合。类似于函数,但不同于函数,可以把块作为表达式或变量的一部分,或者作为参数传递。在作为参数传递块时,代码被作为数据的一部分进行传递。块具有以下特征:同函数一样,有类型化参数列表。有返回结果或者要申明返回类型。能获取同一作用域(与块所在同一作用域)内的状态。可以修改同一作用域的状态(变量)。与同一范围内的其他块同享变量。在作用域释放后能继续共享和改变同一范围内的变量。除以上特点外,甚至可以复制块并传递到其他后续执行的线程,编译器和运行时负责把所有块引用的变量保护在所有块的拷贝的生命周期内。当然,这已经超出了本章的范围,可以参考苹果官方文档来了解这些内容。 3.5.2 Objective-C 中的块 对于C和C++,块是变量,但对于Objective-C,块仍然是对象。下面简单介绍Objective-C中的块。1.块变量声明用^操作符声明一个块变量的开始,分号表示块结束,如下代码所示: int multiplier = 7; int (^myBlock)(int) = ^(int num) { return num multiplier; }; 块语法比较奇怪,块变量声明的解释如图3-2所示。 块变量的声明语句从前至后分为了几部分:返回值类型,如int、double,如果未显式地声明块的返回值类型,可能会自动从块代码中推断返回类型(通过return语句)。块变量名用括号括住,块变量名前加^符号。参数类型用括号括住,多个参数以逗号分隔,如果参数列表为void,而且返回类型依靠推断,可以省略参数列表的void。等号,将后面的块赋值给前面的块变量(即myBlock)。以^开头并以;结束的块定义。块定义中又分为以下两个部分(除去开头的^和结尾的;外):参数列表,同函数的参数列表。块体,同函数体。值得注意的是,块可以使用同一作用域内定义的变量,而函数不行。一旦声明了块,你可以像使用函数一样调用它: int multiplier = 7; int (^myBlock)(int) = ^(int num) { return num multiplier; }; printf ( "%d", myBlock(3)); 2.行内块有时候,你不准备重复使用某个块,因此你不必为它想一个名称。那你可以使用行内块而不用声明为块变量。以下代码来自苹果文档:// gsort_b类似标准的 gsort_r 函数,但它最后一个参数是一个块。 char myCharacters[3] = { "TomJohn", "George", "Charles Condomine" }; qsort_b(myCharacters, 3, sizeof(char ), ^(const void l, const void r) { char left = (char )l; char right = (char )r; return strncmp(left, right, 1); }); // myCharacters 现在是 { "Charles Condomine", "George", TomJohn" } 在qsort_b 方法调用中,第4个参数就是一个匿名的块(行内块)。匿名块跟块变量不同,它没有变量名,因此你无法重用匿名块。下次调用这个块时,必须把整个块定义的代码再复制一遍。3.__block关键字块允许访问本地变量。这很重要。它使得我们在线程间共享变量变得简单,而且,你可以规定一个本地变量是否可以写,这可通过使用__block关键字,这是一种类类似register、auto和static存储类型修饰符。用__block修饰的变量,可以在所有同一作用域内的块,以及块复制之间共享数据。在指定作用域内的多个块能同时使用共享变量。如同块,__block变量也使用栈存储。如果使用block_copy拷贝块(或者向块发送copy消息),变量被拷贝到堆里。而且,__block变量的地址随后就会改变。__block变量有两个限制:不能是可变长度的数组,也不能是包含C99可变长度数组的结构体。下面显示了__block变量的使用: __block int x = 123; // x 是块可写的 void (^printXAndY)(int) = ^(int y) { x = x + y; printf("%d %d\n", x, y); }; printXAndY(456); // 打印出: 579 456 // x 现在的值是:579 下面显示了在块中使用多种类型的变量: extern NSInteger CounterGlobal; static NSInteger CounterStatic; { NSInteger localCounter = 42; __block char localCharacter; void (^aBlock)(void) = ^(void) { ++CounterGlobal; ++CounterStatic; CounterGlobal = localCounter; localCharacter = 'a'; }; ++localCounter; localCharacter = 'b'; aBlock(); }

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

《企业级ios应用开发实战》一3.4 KVO模型

3.4 KVO模型 KVO(key-value observer,“键-值”观察)模型是Cocoa绑定技术中常用的一种编程模型,它可以使一个对象在属性值发生变化时主动通知另一个对象并触发相应的方法。与NSNotification 不同,KVO没有所谓的中心对象来为所有观察者提供变化通知。当“被观察者”对象状态发生变化时,通知被直接发送至“观察者”对象,如图3-1所示。 在图3-1中,观察者是aButton,被观察者是modelObject。aButton是一个按钮控件,它是一个UI对象,有一个BOOL型的enabled属性,表示按钮是否可被点击。modelObject对象是一个模型对象,它没有可以呈现给用户的界面,同样,它有一个BOOL属性selected。通过KVO模型,modelObject的selected属性可以绑定到UIButton的enabled属性。即当modelObject的selected属性发生变化时(这是可以被编程的),KVO会主动通知aButton这种改变,因此按钮的外观随之可发生相应的呈现。比如由不可点击的灰色改变为可点击的着色状态。KVO是一种很有用的绑定技术(Cocoa还提供另外一种绑定技术:Dynamic bingding)。而且它是由被观察的对象主动通知观察者的,并不需要经过一个统一的通知中心(如后面章节介绍的通知技术所述),它的执行效率和适用场景要更佳。为了实现KVO,你需要进行如下操作:注册观察者。所谓观察者即对象状态变化时需要通知的对象。接收变更通知。接收变更通知主要是让观察者实现指定方法,在指定方法中,你可以接收到对象状态变更的消息,并在方法中进行处理。取消所注册的观察者。观察者处理完状态变更消息之后,需要取消原先的注册状态。 3.4.1 注册KVO 对象要将自己注册为观察者,必须发送一个addObserver:forKeyPath:options:context:消息至被观察对象: [account addObserver:inspector forKeyPath:@"name" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) context:NULL]; 以上例子将inspector对象注册为account对象的观察者,并表明观察者将对名为“name” 的属性变更感兴趣。forKeyPath参数“name”注明了需要观察的属性的关键路径KeyPath。关键路径KeyPath实际是一个字符串,用于表示某个属性,你可以直接用属性名。但如果某属性是一个对象,则KeyPath可以用“.”语法的形式表示对象成员,如“account.name”。options参数注明了对该属性的何种状态感兴趣。NSKeyValueObservingOptionNew表示属性在变更后的新值,NSKeyValueObservingOptionOld表示属性未改变之前的值。以上例子中的option参数设置表明,当name属性变更时,会将这两个值以NSDictionary的方式(即change参数)提交给观察者,观察者可以从NSDictionary中以键-值对的方式检索到这两个值。context参数用于传递一个对象,该对象(或指针)会在属性变化时通过变更通知传递给观察者(通过context参数)。移除观察者的注册,使用方法removeObserver forKeyPath: [subject removeObserver:observer forKeyPath:@"name"]; 3.4.2 接收变更通知 观察者要想收到对象的属性变更通知,需要实现方法observeValueForKeyPath:ofObject: change:context:,并在其中进行通知的处理。例如: - (void)observeValueForKeyPath:(NSString )keyPath ofObject:(id)object change:(NSDictionary )change context:(void )context { NSLog(@"%@",keyPath); if ([keyPath isEqual:@"name"]) { NSLog(@"name is changed:%@", [change objectForKey:NSKeyValueChangeNewKey]); }else [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; } 3.4.3 发送变更通知 NSObject支持两种属性变更通知,一种是自动变更通知,一种是手动变更通知。一般情况下,使用自动变更通知则更为简单,因此我们主要介绍自动变更通知。1.自动变更通知要使用自动变更通知,需要实现被观察者的 automaticallyNotifiesObserversForKey方法,在此方法中明确说明需要使用自动变更通知的属性。对于需要使用自动变更通知的属性,返回YES,如下代码所示: + (BOOL) automaticallyNotifiesObserversForKey:(NSString)key { // 对于属性name ,使用自动通知 if ([key isEqualToString:@"name"]) { return YES; } // 确保调用了父类的automaticallyNotfiesObserversForKey方法 return [super automaticallyNotifiesObserversForKey:key]; } 然后,在name属性发生变化的时候通知观察者,比如调用以下语句之一: subject.name=newName; [subject setValue:newName forKey:@"name"]; [subject setValue:newName forKeyPath:@"name"]; 如果属性是集合类型,则可以使用方法mutableSetValueForKey来支持以下集合方法导致的自动变更通知:添加:insertObject:InKey:或者insertObject:AtIndex:替换:replaceObject:InKey:或者replaceObject:AtIndex:删除:removeObjectFromKey:或者removeObjectAtIndex:2.手动变更通知对于手动变更通知,除了需要在automaticallyNotifiesObserversForKey:方法中将要使用的手动变更通知返回NO外,还需要 在改变值之前调用willChangeValueForKey:并在更改它之后调用didChangeValueForKey:。为了便于你理解KVO模型,我做了一个示例程序,放在光盘“source/第3章/TestKVO”文件夹,它使用了本节所介绍的知识点,可供参考和学习。

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

《企业级ios应用开发实战》一3.6 可变参数

3.6 可变参数 我们知道,C和C++语言支持可变参数的函数,例如我们常用的NSLog和printf函数。Objective-C作为C语言的超集,当然毫无例外地也支持可变参数。迄今为止,我们至少用过了一种使用可变参数的方法,即NSString的stringWithFormat:方法。C语言通过stdarg.h库支持可变参数,Objective-C 也不例外。在C语言中,如果你要使用可变参数,必须包含头文件stdarg.h,但在Cocoa中却不必,因为苹果已经在 NSObjC Runtime.h中包含了stdarg.h。stdarg.h的定义如下: typedef __void va_list; #define va_start(ap, param) __builtin_va_start(ap, param) #define va_end(ap) __builtin_va_end(ap) #define va_arg(ap, type) __builtin_va_arg(ap, type) 首先定义了一个va_list类型,其实就是一个void,即可以指向任何类型的指针。你可以把它看成是char,因为char*实际上也可以指向任何内存单元的地址。然后是3个预定义宏,va_start、va_end和va_arg。可以看出stdarg.h完全是以“预定义宏”这种“古老”的方式来支持可变参数的。接下来我们看一个例子,该方法使用了一个可变参数,并将这些可变参数进行了累加,然后返回一个NSNumber: - (NSNumber ) addValues:(int) count, ... { va_list args; va_start(args, count); NSNumber value; double retval; for( int i = 0; i < count; i++ ) { value = va_arg(args, NSNumber ); retval += [value doubleValue]; } va_end(args); return [NSNumber numberWithDouble:retval]; } 代码说明:第1行是方法定义,该定义应当加到头文件中。省略号...表明方法接收一系列数目不定的参数,在...前面至少需要指定一个任意类型的参数。有时我们必须知道参数的个数以防止出现无效的引用,但在某种情况下,参数个数是可以通过其他参数推断出来的(例如NSLog或printf函数可以通过计算%号的个数推断可变参数的个数),或者对于NSMutableArray来说,它总是以nil终止。如果是最后一种方法,我们可以把方法重新定义为: - (NSNumber ) addValues:(NSNumber ) firstNumber, ... 这样,我们就可以用以下调用方式代替“addValues:3,num1,num2,num3”: addValues:num1,num2,num3; 这样,我们就可以省略第1个表示可变参数个数的int参数。第2行中的va_list是void *类型,因此它实际上是一个可变的对象数组。第3行用args来存放可变参数列表,而count则表示函数最后一个参数(即第一个“固定参数”)。这将使编译器把args指向第1个参数后的位置(通过count地址加上count变量的长度)。很奇怪吗?可变参数中第1个参数的位址为什么是“count地址+count的长度”?因为对于大多数C编译器,函数栈中参数的存放顺序是从右到左的,也就是说先放入可变参数的最后一个参数,再放可变参数的倒数第2个参数……,然后放可变参数的第1个参数,最后是固定参数count。而与此同时,栈的方向是向下的,即先入栈的数据位于高地址,后入栈的数据则位于栈的起始地址。这样,实际上最后放入的固定参数count的地址变成了栈的起始地址。而紧随count之后的地址则是可变参数的第1个参数地址,即“count地址+count的长度”,因此编译器要能找到第1个可变参数的地址,只要知道1个参数:count就够了,由count取得函数栈的起始地址,加上sizeof(count),得到第1个可变参数的地址。va_start的第1个参数args是一个输出参数,经过va_start调用之后,args将等于arg_start计算出来的第1个可变参数的地址。第6行是一个for循环,因为我们无法通过 args 自身推断 args 的大小,因此必须显式地用count来指定args的大小。或者可以使用nil终止的列表来检索可变参数。如果你使用nil终止的数组作为可变参数,则应该用下面一行来代替第6~7行: while( value = va_arg( args, NSNumber ) ) 第 7 行将 args 中的下一个参数放入 value,并显式地转为 NSNumber*(如果不知道类型,可以用id)。第10行表明,一旦使用完args列表,就关闭它 。提示:如果你使用va_arg(args,double)(或者float等其他原始类型),那么当你试图传递一系列整数作为参数时(例如:addValues:4,4,3,2,1),可能会出现一些古怪的结果。而如果你显式地将这些参数说明为double(例如,double num1,double num2,double num3,double num4)则不会有什么问题。这是因为,如果编译器看到一个方法有一个double参数但你却传递了一个整数给这个方法时,它会进行类型转换。但如果方法使用了可变参数,编译器无法知道参数所使用的类型,因此编译器只会简单地把参数作为整型处理。

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

《企业级ios应用开发实战》一3.7 本章小结

3.7 本章小结 Objective-C是C语言的扩展和超集。本章重点从C语言特性和面向对象特性两个方面对Objective-C的语言特性进行论述,包括基本语法(数据类型、常量/变量、分支与循环)、运行时特性(反射支持)和一些特有属性(NS类、类别和协议、消息、KVO和块)。通过这些介绍,我们对Objective-C的一些重要特性有了最基本的了解,从而为后续的学习打下坚实的基础。接下来,本书将陆续介绍iOS SDK中的一些重要框架,如UIKit、Core Animation、Quartz Core,以及其他一些第三方的开源框架。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

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

Nacos

Nacos

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

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

用户登录
用户注册