【JAVA使用笔记】——SpringBoot启动方式及远程调用(二)

上一篇: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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值