欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring原生Rpc六種的正確打開方式實現(xiàn)示例

 更新時間:2022年02月25日 17:32:33   作者:kl  
這篇文章主要為大家展示了Spring原生Rpc六種的正確打開方式實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進步早日升職加薪

前言

在java生態(tài)圈談到Rpc,很多人可能就會想到Dubbo、Motan、Grpc等框架。但是你知道嗎?作為Java編程全家桶的Spring已經(jīng)內(nèi)置了多種RPC的實現(xiàn)方式,可以直接使用。存在即合理,有些場景下其實并不需要Dubbo,Grpc等重量級的RPC組件,那么Spring的輕量封裝就可以派上用場了。下面就來探索下Spring中的RPC的實現(xiàn)方式以及如何使用的。

文中代碼地址:https://gitee.com/kailing/spring-rpc

什么是Rpc?

Rpc(Remote Procedure Call): 封裝了內(nèi)部實現(xiàn)的遠程調(diào)用過程就是rpc,rpc主要為了簡化遠程服務(wù)調(diào)用,通俗的講就是調(diào)用遠程服務(wù)(跨主機,跨進程)就像調(diào)用本地方法一樣。Spring Cloud體系中的Fegin 技術(shù)也可以認為是采用http協(xié)議傳輸數(shù)據(jù)的一種Rpc技術(shù)。

Spring中的Rpc

Spring中內(nèi)置了六種不同數(shù)據(jù)傳輸方式的原生的Rpc實現(xiàn),分別是WebService、Jms、Rmi、Http、Hessian(http)、Amqp。熟悉Rpc的知道,在Java中,主要是通過生成服務(wù)接口的代理來實現(xiàn)Rpc服務(wù)的調(diào)用,Dubbo、Motan這樣,Spring的實現(xiàn)也是這樣。在Rpc服務(wù)調(diào)用中,有兩個角色,分別是服務(wù)的提供者和調(diào)用者(消費者)。一方面服務(wù)調(diào)用者通過代理,在服務(wù)調(diào)用時會傳輸服務(wù)定義的接口名+方法參數(shù)給到提供者。另一方面服務(wù)提供者拿到接口信息找到本地服務(wù)生成調(diào)用結(jié)果返回給調(diào)用者。所以下面所述六種Rpc實現(xiàn)都會有一個公共的服務(wù)接口定義,以及各自的代理實現(xiàn)配置。

定義服務(wù)接口

/**
 * @WebService 注解只用于ws 提供的RPC服務(wù)
 */ @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的提供者和消費者中都會使用到,提供者中會實現(xiàn)這個接口提供服務(wù),消費者會通過代理,生成這個接口的代理實現(xiàn) ,然后通過底層封裝發(fā)送具體的消息。和使用dubbo和motan類似

調(diào)用服務(wù)代碼

@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遠程訪問結(jié)束!");
	} public static void main(String[] args) {
		SpringApplication.run(WsConsumerApplication.class, args);
	}
}

每個Rpc實現(xiàn)都一樣,都是通過注入AccountService 接口的代理實現(xiàn)來調(diào)用服務(wù)。不過每個Rpc的代理的配置方式會略有不同,主要體現(xiàn)在不同的傳輸技術(shù)會用到不同的配置。總的來說,連接url(http://127.0.0.1、tcp://172.0.0.1、rmi://127.0.0.1),端口、代理接口信息等都是共同需要的。

WEBSERVICE的RPC實現(xiàn)

服務(wù)提供者

服務(wù)實現(xiàn)

@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;
    }
}

和其他服務(wù)實現(xiàn)不一樣,WebService定義服務(wù)時,需要使用@WebService和@WebMethod注解標記

服務(wù)暴露

@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;
    }
}

完成如上代碼,其實我們已經(jīng)構(gòu)建了一個完整的WebService服務(wù),而且還加上了用戶、密碼和ip白名單等接口權(quán)限認證,訪問:http://127.0.0.1:8083/AccountServiceImpl?WSDL 就可以看到服務(wù)的定義,如下:

服務(wù)消費者

@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的代理實例。當注入服務(wù)調(diào)用方法時,實際上是觸發(fā)了一次WebService的遠程調(diào)用

HTTP的RPC實現(xiàn)

服務(wù)提供者

服務(wù)實現(xiàn)

@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;
    }
}

服務(wù)暴露

@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;
    }
}

服務(wù)消費者

@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實現(xiàn)的Rpc服務(wù)消費者時,和WebService是類似的,定義一個FactoryBean就ok了。其實其他的四種Rpc實現(xiàn)也都大同小異。后面就不一一列舉了

文末結(jié)語

博文起草構(gòu)思的時候本來打算將Spring中內(nèi)置六種Rpc實現(xiàn)都詳細描述下,后面看著看著就覺得使用起來真的很類似。只不過像Amqp和Jms以及WebService等實現(xiàn)需要有這方面技術(shù)經(jīng)驗的人才能看的明白。但單就Rpc使用和實現(xiàn)來說基本差不多,所以后面就沒有一一列出占用篇幅。但是上面提到的WebService、Jms、Rmi、Http、Hessian、Amqp這六種實現(xiàn)在上面的git倉庫中都有詳細的實例程序。感興趣的不妨下載下來跑一跑,看下每個實現(xiàn)的代理工廠類都是如何實現(xiàn)的,非常有助于你真正理解Rpc的調(diào)用過程,以及實現(xiàn)自己的Rpc輪子。

以上就是Spring原生Rpc六種的正確打開方式實現(xiàn)示例的詳細內(nèi)容,更多關(guān)于Spring原生Rpc打開方式的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 關(guān)于idea一直卡在build不動的解決方案

    關(guān)于idea一直卡在build不動的解決方案

    這篇文章主要介紹了idea一直卡在build不動的解決方案,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • J2SE 1.5版本的新特性一覽

    J2SE 1.5版本的新特性一覽

    J2SE 1.5版本的新特性一覽...
    2006-12-12
  • java動態(tài)構(gòu)建數(shù)據(jù)庫復雜查詢教程

    java動態(tài)構(gòu)建數(shù)據(jù)庫復雜查詢教程

    這篇文章主要介紹了java動態(tài)構(gòu)建數(shù)據(jù)庫復雜查詢的實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2021-11-11
  • 大廠面試???快速排序冒泡排序算法

    大廠面試???快速排序冒泡排序算法

    快速排序由于排序效率在同為O(N*logN)的幾種排序方法中效率較高,因此經(jīng)常被采用,再加上快速排序思想----分治法也確實實用,因此很多軟件公司的筆試面試,包括像BAT、字節(jié)、美團等知名IT公司都喜歡考查快速排序原理和手寫源碼
    2021-08-08
  • JDK8 new ReentrantLock((true)加鎖流程

    JDK8 new ReentrantLock((true)加鎖流程

    這篇文章主要介紹了java面試中常遇到的問題JDK8 new ReentrantLock((true)加鎖流程示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • 淺談java object對象在heap中的結(jié)構(gòu)

    淺談java object對象在heap中的結(jié)構(gòu)

    本文主要介紹了淺談java object對象在heap中的結(jié)構(gòu),感興趣的同學,可以參考下。
    2021-06-06
  • Java中的synchronized和ReentrantLock的區(qū)別詳細解讀

    Java中的synchronized和ReentrantLock的區(qū)別詳細解讀

    這篇文章主要介紹了Java中的synchronized和ReentrantLock的區(qū)別詳細解讀,synchronized是Java內(nèi)建的同步機制,所以也有人稱其為 IntrinsicLocking,它提供了互斥的語義和可見性,當一個線程已經(jīng)獲取當前鎖時,其他試圖獲取的線程只能等待或者阻塞在那里,需要的朋友可以參考下
    2024-01-01
  • Java中的ConcurrentHashMap集合源碼解析

    Java中的ConcurrentHashMap集合源碼解析

    這篇文章主要介紹了Java中的ConcurrentHashMap集合源碼解析,ConcurrentHashMap底層容器和HashMap相同,同樣是Node數(shù)組+鏈表+紅黑樹,不同的是在原來的基礎(chǔ)之上使用了Synchronized+CAS來保證線程安全,下面我們來進行源碼分析,需要的朋友可以參考下
    2023-11-11
  • Java反射機制的講解

    Java反射機制的講解

    今天小編就為大家分享一篇關(guān)于Java反射機制的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • Spring外部化配置的幾種技巧分享

    Spring外部化配置的幾種技巧分享

    在油管上看了龍之春的一個Spring tips 視頻,講述Spring外部化配置的幾種技巧,收獲頗多,想拿出來給大家分享下。對spring感興趣的朋友可以了解下本文
    2021-06-06

最新評論