返回顶部
首页 > 资讯 > 精选 >Spring原生Rpc的正确打开方式有哪些
  • 823
分享到

Spring原生Rpc的正确打开方式有哪些

2023-06-29 07:06:59 823人浏览 安东尼
摘要

本文小编为大家详细介绍“spring原生rpc的正确打开方式有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring原生Rpc的正确打开方式有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是Rp

本文小编为大家详细介绍“spring原生rpc的正确打开方式有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring原生Rpc的正确打开方式有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

什么是Rpc?

Rpc(Remote Procedure Call): 封装了内部实现的远程调用过程就是rpc,rpc主要为了简化远程服务调用,通俗的讲就是调用远程服务(跨主机,跨进程)就像调用本地方法一样。spring cloud体系中的Fegin 技术也可以认为是采用Http协议传输数据的一种Rpc技术。

Spring中的Rpc

Spring中内置了六种不同数据传输方式的原生的Rpc实现,分别是WEBService、Jms、Rmi、Http、Hessian(http)、AMQp。熟悉Rpc的知道,在Java中,主要是通过生成服务接口的代理来实现Rpc服务的调用,dubbo、Motan这样,Spring的实现也是这样。在Rpc服务调用中,有两个角色,分别是服务的提供者和调用者(消费者)。一方面服务调用者通过代理,在服务调用时会传输服务定义的接口名+方法参数给到提供者。另一方面服务提供者拿到接口信息找到本地服务生成调用结果返回给调用者。所以下面所述六种Rpc实现都会有一个公共的服务接口定义,以及各自的代理实现配置。

定义服务接口

 @WebService public interface AccountService { Account getAccount(String name);          class Account implements Serializable { private String name; public String getName(){ return name;          } public void setName(String name) { this.name = name;          }     }}

公共的api,在Rpc的提供者和消费者中都会使用到,提供者中会实现这个接口提供服务,消费者会通过代理,生成这个接口的代理实现 ,然后通过底层封装发送具体的消息。和使用dubbo和motan类似

调用服务代码

@SpringBootApplication public class WsConsumerApplication { @Autowired private AccountService accountService; @PostConstruct public void callRpcService(){System.out.println("RPC远程访问开始!");System.err.println(accountService.getAccount("kl").getName());System.out.println("RPC远程访问结束!");} public static void main(String[] args) {SpringApplication.run(WsConsumerApplication.class, args);}}

每个Rpc实现都一样,都是通过注入AccountService 接口的代理实现来调用服务。不过每个Rpc的代理的配置方式会略有不同,主要体现在不同的传输技术会用到不同的配置。总的来说,连接url(http://127.0.0.1、tcp://172.0.0.1、rmi://127.0.0.1),端口、代理接口信息等都是共同需要的。

WEBSERVICE的RPC实现

服务提供者

服务实现
@WebService(serviceName="AccountService",endpointInterface = "com.spring.rpc.api.AccountService") @Service public class AccountServiceImpl extends SpringBeanAutowiringSupport implements AccountService { Logger logger = LoggerFactory.getLogger(getClass()); @Override @WebMethod public Account getAccount(String name) {        logger.info("{} 请求获取账号!", name);        Account account = new Account();        account.setName(name + "的账号"); return account;    }}

和其他服务实现不一样,WebService定义服务时,需要使用@WebService和@WebMethod注解标记

服务暴露
@Configuration public class WsConfig { private String ipList = "127.0.0.1"; private String userName = "admin"; private String passWord = "sasa"; @Bean public SimplehttpserverJaxWsServiceExporter rmiServiceExporter(Authenticator authenticator) {        SimpleHttpServerJaxWsServiceExporter exporter = new SimpleHttpServerJaxWsServiceExporter();        exporter.setHostname("127.0.0.1");        exporter.setPort(8083);        exporter.setAuthenticator(authenticator); return exporter;    } @Bean public Authenticator authenticator(){        Authenticator authenticator = new Authenticator();        authenticator.setIpList(ipList);        authenticator.setUserName(userName);        authenticator.setPassWord(passWord); return authenticator;    }}

完成如上代码,其实我们已经构建了一个完整的WebService服务,而且还加上了用户、密码和ip白名单等接口权限认证,访问:http://127.0.0.1:8083/AccountServiceImpl?WSDL 就可以看到服务的定义,如下:

Spring原生Rpc的正确打开方式有哪些

服务消费者

@Configuration public class WsConfig { @Bean("accountService") public JaxWsPortProxyFactoryBean accountService()throws Exception{        JaxWsPortProxyFactoryBean factoryBean = new JaxWsPortProxyFactoryBean();        factoryBean.setServiceName("AccountService");        factoryBean.setPortName("AccountServiceImplPort");        factoryBean.setNamespaceUri("http://provider.ws.rpc.spring.com/");        URL wsdlDocumentUrl = new URL("http://127.0.0.1:8083/AccountServiceImpl?WSDL");        factoryBean.setWsdlDocumentUrl(wsdlDocumentUrl);        factoryBean.setServiceInterface(AccountService.class);        factoryBean.setUsername("admin");        factoryBean.setPassword("sasa"); return factoryBean;    }}

通过声明JaxWsPortProxyFactoryBean来获得AccountService.class的代理实例。当注入服务调用方法时,实际上是触发了一次WebService的远程调用

HTTP的RPC实现

服务提供者

服务实现
@Service public class AccountServiceImpl implements AccountService { Logger logger = LoggerFactory.getLogger(getClass()); @Override public Account getAccount(String name) {        logger.info("{} 请求获取账号!", name);        Account account = new Account();        account.setName(name + "的账号"); return account;    }}
服务暴露
@Configuration public class HttpConfig { @Bean("/AccountService") public HttpInvokerServiceExporter rmiServiceExporter(AccountServiceImpl accountService){        HttpInvokerServiceExporter exporter = new HttpInvokerServiceExporter();        exporter.setService(accountService);        exporter.setServiceInterface(AccountService.class); return exporter;    } @Bean public ServletReGIStrationBean servletRegistrationBean(DispatcherServlet dispatcherServlet) {        ServletRegistrationBean servlet = new ServletRegistrationBean();        servlet.setServlet(dispatcherServlet);        servlet.setName("remoting");        servlet.setLoadOnStartup(1);        servlet.addUrlMappings("/remoting/*"); return servlet;    }}

服务消费者

@Configuration public class HttpConfig { @Bean("accountService") public HttpInvokerProxyFactoryBean accountService(){        HttpInvokerProxyFactoryBean factoryBean = new HttpInvokerProxyFactoryBean();        factoryBean.setHttpInvokerRequestExecutor(new HttpComponentsHttpInvokerRequestExecutor());        factoryBean.setServiceUrl("http://127.0.0.1:8081/remoting/AccountService");        factoryBean.setServiceInterface(AccountService.class); return factoryBean;    }}

可以看到,在配置Http实现的Rpc服务消费者时,和WebService是类似的,定义一个FactoryBean就ok了。其实其他的四种Rpc实现也都大同小异。后面就不一一列举了

读到这里,这篇“Spring原生Rpc的正确打开方式有哪些”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: Spring原生Rpc的正确打开方式有哪些

本文链接: https://lsjlt.com/news/323509.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Spring原生Rpc的正确打开方式有哪些
    本文小编为大家详细介绍“Spring原生Rpc的正确打开方式有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring原生Rpc的正确打开方式有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是Rp...
    99+
    2023-06-29
  • Spring原生Rpc六种的正确打开方式实现示例
    目录前言什么是Rpc?Spring中的Rpc定义服务接口调用服务代码WEBSERVICE的RPC实现服务提供者服务实现服务暴露服务消费者HTTP的RPC实现服务提供者服务实现服务暴露...
    99+
    2024-04-02
  • MySQL中MVCC的正确打开方式
     最近在学习MySQL中的MVCC,看了网上的各种版本,什么创建版本号、删除版本号,一开始看的时候,好像很对的样子,但实际上很多都是错误的。经过好几天的查阅对比,在几篇博客的帮助下,才算是觉得正确理解了MySQL中的MVCC。       ...
    99+
    2021-07-01
    MySQL中MVCC的正确打开方式
  • nodejs 子进程正确的打开方式
    因为库太拙了,需要在 nodejs 里调用子进程来获取数据。然而看到 child_process 的文档真是头疼,这么多种启动子进程的方法直接推到人面前,也没个解释,命名也十分无用。只能一个个地查看详细说明...
    99+
    2022-06-04
    进程 正确 方式
  • Java继承与多态的正确打开方式
    目录一.概述  二.继承2.1 继承的概述2.2 继承机制2.3 类中属性,方法的继承与覆盖1.属性的继承与覆盖2.方法的继承与覆盖2.4 super ...
    99+
    2024-04-02
  • 报表查询条件的正确打开方式
    众所周知,大拿们在设计报表的时候,需要展现的数据很少是固定不变地,经常需要使用查询条件过滤出我们想要的数据。简而言之就是,同一张报表可以在不同的参数控制下呈现出不同的数据。那么问题来了,报表工具一般都用哪些方法来实现这一需求呢?使用SQL参...
    99+
    2023-06-02
  • Vue配置环境变量的正确打开方式
    目录第一 配置package.json第二 配置介绍 简单说明 看详情点击上面tps第三 在根目录新建文件第四 第五 总结:第一 配置package.json p...
    99+
    2024-04-02
  • golang函数文档编写的正确打开方式
    golang 函数文档应包含函数签名、功能描述、输入参数、输出值和示例。编写函数文档的最佳实践包括使用 godoc 注释、保持简短简洁、提供具体示例、使用代码块和持续更新。 Golan...
    99+
    2024-04-28
    golang 函数文档
  • Android打开蓝牙的方式有哪些
    Android打开蓝牙的方式有以下几种:1. 使用系统设置界面:在Android设备的设置界面中,找到蓝牙选项,点击开启蓝牙。2. ...
    99+
    2023-09-25
    Android
  • winform窗口的打开方式有哪些
    Winform窗口的打开方式有以下几种:1. 使用Show方法:使用窗口的Show方法可以在不阻塞当前窗口的情况下打开一个新窗口。新...
    99+
    2023-10-11
    winform
  • exhentai服务器不稳定,Exhentai的正确打开方式
    Exhentai是一个成人内容的网站,其服务器的稳定性可能会受到一些限制。以下是一些正确打开Exhentai的方式:1. 使用合适的...
    99+
    2023-09-11
    服务器
  • 电脑的正确使用方法有哪些
    本篇内容主要讲解“电脑的正确使用方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“电脑的正确使用方法有哪些”吧!1、U盘的正确打开方式很多朋友打开U盘的方式是这样的:从口袋掏出U盘,插入电...
    99+
    2023-06-28
  • 正确处理网站建设产生的死链的方法有哪些
    本篇内容介绍了“正确处理网站建设产生的死链的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在网站优化工作中,难免会产生死链,那么什...
    99+
    2023-06-10
  • python中有哪些打开文件的方式
    今天就跟大家聊聊有关python中有哪些打开文件的方式,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、函数说明open 函数默认以只读方式打开文件,并且返回文件对象2、语法f&nb...
    99+
    2023-06-15
  • anaconda打不开的原因有哪些
    有以下几个可能的原因导致Anaconda打不开: 安装问题:Anaconda安装可能出现错误或不完整,导致无法正常打开。可以尝试...
    99+
    2023-10-21
    anaconda
  • 打不开vps的原因有哪些
    打不开VPS的原因有以下几种可能性:1. 网络连接问题:可能是VPS所在的网络环境存在问题,比如网络故障、网络延迟等导致无法连接。2...
    99+
    2023-08-11
    vps
  • pycharm打不开的原因有哪些
    有以下几个可能的原因: 安装问题:可能是由于安装过程中出现了错误或者未能正确安装PyCharm导致无法打开。 兼容性问题:可...
    99+
    2024-02-29
    pycharm
  • access数据库打开方式有哪些
    Access数据库可以通过以下几种方式进行打开:1. 使用Access应用程序打开数据库文件:可以直接双击数据库文件(.mdb或.a...
    99+
    2023-08-11
    access数据库
  • spring的注入方式有哪些
    Spring的注入方式有三种:1. 构造器注入(Constructor Injection):通过构造方法来注入依赖对象。2. Se...
    99+
    2023-09-27
    spring
  • spring配置的方式有哪些
    在Spring框架中,配置的方式有以下几种: XML配置:使用XML文件来配置Spring的各种组件、依赖关系和属性等。XML文...
    99+
    2023-10-25
    spring
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作