《Spring 实战》Spring集成

小咪咪 2023-07-11 12:51 109阅读 0赞

远程服务

Spring支持的RPC模型:
1、远程方法调用(RMI):适合不考虑网络限制(例如防火墙),访问基于Java的服务(提供的远程服务有注册表)使用Java本身的序列化机制
2、Hessian/Burlap:适合需要考虑网络限制,通过http访问Java,前者是二进制通信(可以和其他语言交互,比xml通信更高效),Burlap基于XML(和可以解析xml的语言交互),它们都使用私有的序列化机制,所以当数据模型比较复杂时难以胜任

基于上面的网络限制和序列化方式的限制,以上两种远程服务的缺陷,http invoker使用http访问,并且基于java序列化机制。

3、http invoker:考虑网络限制,并希望使用XML序列化或者转悠序列化时,访问基于Spring的服务(客户端和服务端都必须是Spring的Java应用,因为java序列化的原因:被传输的对象客户端和服务端必须使用相同版本)

以上三种提供远程访问的服务都需要相应的服务导出器:
RmiServiceExporter
HessianServiceExporter
BurlapServiceExporter
HttpInvokeServiceExporter
这些导出器讲服务转换成远程服务

4、访问/发布平台独立的,基于SOAP的Web服务
Spring为使用Java API for XML Web Service(JAX-WS)来发布和使用SOAP服务提供支持
JAX-WS端点类没有委托给Spring,但是它需要Spring为它使用@Autowired来注入属性,所以它继承了SpringBeanAutowiringSupport

这些模型种,远程服务通过代理作为调用端Spring管理的bean,配置到应用中。客户端向代理发起调用,代理代表客户端与远程服务进行通信,负责处理连接的细节并向远程服务发起调用。

Hessian的HessianServiceExporter是一个SpringMVC控制器(DispatcherServlet)。Hessian提供远程服务没有组册表,因为其为http请求的服务,并且通过SpringMVC控制器实现,所以需要部署为web服务。需要配置DispatcherServlet和url处理器(Servlet)把访问它的url分发给它。
示例代码:

  1. //将以.service结尾的url都给Hessian处理
  2. public class MyServletInitiation implements WebApplicationInitializer{
  3. @Override
  4. public void onStartup(ServletContext servletContext) throws ServletException {
  5. Dynamic myServlet = servletContext.addServlet("myServlet", MyServlet.class);
  6. myServlet.addMapping("/");
  7. myServlet.addMapping("*.service");
  8. }
  9. //

使用Spring MVC创建REST(Representational State Transfer)API

REST以信息为中心,是替代SOAP Web服务的方案,SOAP关注行为和处理REST关注的是要处理的数据。
Spring为创建REST API提供了良好的发展。
什么是REST:
REST和RPC没有任何关系,RPC面象服务,关注行为和动作,REST是面像资源的,强调描述应用程序的事务和名词。
REST的资源可以使用各种形式表述:json,xml,html,它更关注与资源的状态而不是对资源采取的行为,涉及到转移资源数据,以某种表述性形式从一个应用(客户端或服务端)转移到另一个应用。

REST中,资源通过Url识别和定位,行为通过HTTP犯法来定义:GET,POST,PUT,DELETE,PATCH

PUT/PATCH对应CRUD中的U
在这里插入图片描述
ContentNegotiatingViewResolver,一个特别得视图解析器,
ContentNegotiatingViewResolver考虑客户端需要什么样的内容,通过同一套接口可以同时为客户端提供不同的类型的内容,它与其他的视图解析器不同的地方在于,它不解析视图,它委托别的解析器解析视图在这里插入图片描述
在Spring 中使用Java配置

  1. @Configuration
  2. public class RESTConfig extends WebMvcConfigurerAdapter {
  3. @Bean
  4. public ViewResolver cnViewResolver(ContentNegotiationManager contentNegotiationManager){
  5. //ContentNegotiatingViewResolver考虑客户端需要什么样的内容,它与其他的视图解析器不同的地方在于,它不解析视图,它委托别的解析器解析视图
  6. ContentNegotiatingViewResolver contentNegotiationResolver = new ContentNegotiatingViewResolver();
  7. contentNegotiationResolver.setContentNegotiationManager(contentNegotiationManager);
  8. return contentNegotiationResolver;
  9. }
  10. @Override
  11. public void configureContentNegotiation(ContentNegotiationConfigurer contentNegotiationConfigurer) {
  12. //设置默认内容类型为Json
  13. contentNegotiationConfigurer.defaultContentType(MediaType.APPLICATION_JSON);
  14. }
  15. @Bean
  16. /** * 把视图名当作BeanName,查找视图View 这是被ContentNegotiatingViewResolver委托的视图解析器 * 题外话:BeanNameViewResolver,不是个好选择 */
  17. public ViewResolver beanNameViewResolver(){
  18. //BeanNameViewResolver通过视图名找到View
  19. return new BeanNameViewResolver();
  20. }
  21. /** *如果逻辑视图名为"hah" 那么BeanNameViewResolver会解析MappingJackson2JsonView * */
  22. @Bean
  23. public View hah(){
  24. return new MappingJackson2JsonView();
  25. }
  26. }

http信息转换使用@ResponseBody,@RequestBody
是ContentNegotiatingViewResolver的替换功能,也是为资源生成不同的表述的。在消息转换中,不需要视图和模型,只有Controller中产生的数据,和消息转换器,以及转换后的表述,客户端需要什么表述在请求头中的Accept中。这些转换器还能将客户端请求输入的json和xml转换为对象,DispatcherServlet查看请求头中的Content-type,然后选择相应的转换器将表述转换为java对象。
Spring’ 自带各种转换器,根据请求的Accept信息决定使用哪一个MessageConverter(例如:MappingJackson2HttpMessageConverter、Jaxb2CollectionHttpMessageConverter)转换器

但是需要添加一些库。DispatcherServlet会使用Accept信息,并找到相应的转换器。
注意 @RequestMapping的produces属性,关注请求的accept属性。@RequestMapping的consumers属性关注请求的content-type

  1. //只处理accept为application/json的请求,如果请求头accept信息不符,将不会被转发到这个接口
  2. @RequestMapping(path = "/login", produces ="application/json")

RestTemplate

定义了36个方法与REST资源交互

Spring 消息

客户端同步调用服务端的缺点:
1、同步等待
2、客户端和服务端通过服务端的接口耦合
3、客户端与服务端的位置耦合
4、服务端的可用性
在这里插入图片描述

使用JMX(Java Management Extension)管理Spring Bean

使用java管理扩展(JMX)可以在了解已经运行部署的应用运行情况,还可以在运行时修改应用配置。

JMX的核心组件是Manage Bean(托管bean,MBean),是暴露特定方法的javaBean。Spring 的MBeanExporter将Spring Bean到导出为 MBean服务。导出后的Mbean服务可以被JConsole和VisualVM查看。

  1. /** * 配置导出为Mbean服务的Spring Bean * userLoginController可以被JConsole查看了 */
  2. @Bean
  3. public MBeanExporter mBeanExporter(UserLoginController userLoginController, MBeanInfoAssembler assembler){
  4. MBeanExporter mBeanExporter = new MBeanExporter();
  5. Map<String, Object> beans = new HashMap<>();
  6. beans.put("simple-login=userLoginController",userLoginController );
  7. mBeanExporter.setBeans(beans);
  8. //指定暴露Bean中得哪些方法、属性
  9. mBeanExporter.setAssembler(assembler);
  10. return mBeanExporter
  11. }
  12. /** * 创建MBean服务 */
  13. @Bean
  14. public MBeanServerFactoryBean mBeanServerFactoryBean(){
  15. return new MBeanServerFactoryBean();
  16. }
  17. @Bean
  18. public MethodNameBasedMBeanInfoAssembler mBeanInfoAssembler(){
  19. MethodNameBasedMBeanInfoAssembler methodNameBasedMBeanInfoAssembler = new MethodNameBasedMBeanInfoAssembler();
  20. //多个方法用,隔开
  21. methodNameBasedMBeanInfoAssembler.setManagedMethods(new String[]{ "login"});
  22. return methodNameBasedMBeanInfoAssembler;
  23. }

一个个写,差评!

为了细粒度得控制Bean中得方法暴露,提供了以下几种选择:
1、通过名称来选择需要暴露或忽略得Bean
2、通过为Bean增加接口来选择要暴露得方法
3、通过注解来表示暴露得属性操作@ManagedResource(objectName=“login:name=LoginController”)B标注Bean
用@ManagedPeration或@managedAtrribute标注方法和属性

发表评论

表情:
评论列表 (有 0 条评论,109人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Spring 实战Spring集成

    远程服务 Spring支持的RPC模型: 1、远程方法调用(RMI):适合不考虑网络限制(例如防火墙),访问基于Java的服务(提供的远程服务有注册表)使用Java本