上一篇:https://blog.csdn.net/NEU_LightBulb/article/details/102891292
下一篇:https://blog.csdn.net/NEU_LightBulb/article/details/102894232
二、SpringBoot的启动方式
1.拒绝包办婚姻
上文中有提到依赖中的spring-boot-starter-web已经默认集成了spring-boot-starter-tomcat使得我们不做任何修改默认就是使用SpringBoot集成的Tomcat,这种包办婚姻总会存在双方不和的问题。比如,要是不想用Tomcat比如用Jetty呢?
SpringBoot是有Jetty集成,但是反抗包办婚姻往往是困难的,单单加入依赖是不够的
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
你还要移除原有web starter的tomcat依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
再或者,要是不想使用集成的Tomcat用另一个的Tomcat呢?
这个就更麻烦了,我们甚至不能依赖于Application的main函数了,而是要以类似于web.xml文件配置的方式来启动Spring应用上下文。此时我们需要在启动类中继承SpringBootServletInitializer并实现configure方法,这个类的作用就是代替web.xml。
@SpringBootApplication
public class OtherTomcatApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application){
return application.sources(OtherTomcatApplication .class);
}
public static void main(String[] args) {
SpringApplication.run(OtherTomcatApplication .class, args);
}
}
之后同样移除原有web starter的tomcat依赖,再添加
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
注意,scope必须是provided因为SpringBootServletInitializer需要依赖 javax.servlet,而tomcat-embed-jasper下面的tomcat-embed-core中就有这个javax.servlet,如果没用provided,最终打好的war里面会有servlet-api这个jar,这样就会跟tomcat本身的冲突了。
最后打成War包。
2.单身贵族
上两种都是应用Servlet含Web容器的,要是我只想用Springboot不想和Web有任何瓜葛,做一个单身贵族呢?首先告诉Springboot我想单身,在启动的main方法中将Web的配置类型设置为NONE ,它使用的Context中的onRefresh方法是空的do nothing。这个时候SpringBoot就变成无Web的了,也和一般的Java脚本程序一样执行一遍就结束。
这个演示放在最后的例子里为大家说明
三、远程调用
1.各种方式
1.1 Java Remote Method Invocation(RMI)
简述:jdk中内嵌的一个最底层的解决方案
复杂性:应用起来最轻量级,也最简单,它不需要任何的web服务器,直接在代码中绑定IP地址和相应的端口。
优点:非常简单适合小应用
缺点:过于底层不适用于复杂业务场景和接口频繁调用,更难于实现分布式。Only Java。
1.2 Enterprise JavaBean(EJB)接口远程调用
简述:最本质的底层仍然是JavaRMI,通过Java Naming and Directory Interface(JNDI)来调用服务。
复杂性:客户端编码有些版本比较复杂,但多数代码一般可以借助IDE自动完成
优点:非常轻松的实现分布式
缺点:是个重量级的框架,需要EJB容器的支撑,但很多web服务器都不具备这个功能,如resin、tomcat等。最最最重要的是,Spring横空出世,推荐一本书《Expert One-on-One J2EE Development without EJB 2005-9》详细说了Spring的优势,好多人一入门Web就是Spring,不体会上古时期的程序猿们有多苦逼,对比一下你才知道Spring为什么强大。
1.3 WebService
简述:很常见的远程调用方法,采用SOAP(Simple Object Access Protocol)协议来封装序列化的消息【实际上是形成一个xml文件,可以通过http进行网络传输】
优点:跨平台语言
1.4 Hessian和Spring HttpInvoker
简述:基于Binary-RPC协议【这个协议把请求和响应的数据统统使用标准的二进制格式进行封装】,通过servlet进行请求处理,需要servlet容器支持。
优点:跨平台语言,spring对hessian提供了很好的支持,通常配合使用;同时spring还有一套自己的远程调用方法HttpInvoker。
缺点:hessian在版本控制中经常出现互不兼容的情况,服务器端和客户端通常要保持一致的版本
下面以RMI为例的模块间方法调用
上一篇:https://blog.csdn.net/NEU_LightBulb/article/details/102891292
下一篇:https://blog.csdn.net/NEU_LightBulb/article/details/102894232