<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在java生態圈談到Rpc,很多人可能就會想到Dubbo、Motan、Grpc等框架。但是你知道嗎?作為Java程式設計全家桶的Spring已經內建了多種RPC的實現方式,可以直接使用。存在即合理,有些場景下其實並不需要Dubbo,Grpc等重量級的RPC元件,那麼Spring的輕量封裝就可以派上用場了。下面就來探索下Spring中的RPC的實現方式以及如何使用的。
文中程式碼地址:https://gitee.com/kailing/spring-rpc
Rpc(Remote Procedure Call): 封裝了內部實現的遠端呼叫過程就是rpc,rpc主要為了簡化遠端服務呼叫,通俗的講就是呼叫遠端服務(跨主機,跨程序)就像呼叫本地方法一樣。Spring Cloud體系中的Fegin 技術也可以認為是採用http協定傳輸資料的一種Rpc技術。
Spring中內建了六種不同資料傳輸方式的原生的Rpc實現,分別是WebService、Jms、Rmi、Http、Hessian(http)、Amqp。熟悉Rpc的知道,在Java中,主要是通過生成服務介面的代理來實現Rpc服務的呼叫,Dubbo、Motan這樣,Spring的實現也是這樣。在Rpc服務呼叫中,有兩個角色,分別是服務的提供者和呼叫者(消費者)。一方面服務呼叫者通過代理,在服務呼叫時會傳輸服務定義的介面名+方法引數給到提供者。另一方面服務提供者拿到介面資訊找到本地服務生成呼叫結果返回給呼叫者。所以下面所述六種Rpc實現都會有一個公共的服務介面定義,以及各自的代理實現設定。
/** * @WebService 註解只用於ws 提供的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(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 就可以看到服務的定義,如下:
@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的遠端呼叫
@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實現都詳細描述下,後面看著看著就覺得使用起來真的很類似。只不過像Amqp和Jms以及WebService等實現需要有這方面技術經驗的人才能看的明白。但單就Rpc使用和實現來說基本差不多,所以後面就沒有一一列出佔用篇幅。但是上面提到的WebService、Jms、Rmi、Http、Hessian、Amqp這六種實現在上面的git倉庫中都有詳細的範例程式。感興趣的不妨下載下來跑一跑,看下每個實現的代理工廠類都是如何實現的,非常有助於你真正理解Rpc的呼叫過程,以及實現自己的Rpc輪子。
以上就是Spring原生Rpc六種的正確開啟方式實現範例的詳細內容,更多關於Spring原生Rpc開啟方式的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45