<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ## OpenFeign 通信組件 ### 服務提供方 ![](https://git.kancloud.cn/repos/owenwangwen/open-capacity-platform/raw/6bd496638277e7acc58344aa1f8d29cc9773ef10/images/screenshot_1583305352854.png?access-token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTc4NDg4NzgsImlhdCI6MTYxNzgwNTY3OCwicmVwb3NpdG9yeSI6Im93ZW53YW5nd2VuXC9vcGVuLWNhcGFjaXR5LXBsYXRmb3JtIiwidXNlciI6eyJ1c2VybmFtZSI6Im93ZW53YW5nd2VuIiwibmFtZSI6Im93ZW4iLCJlbWFpbCI6IjYyNDE5MTM0M0BxcS5jb20iLCJ0b2tlbiI6ImI3MmI4MjM5M2M3ZDFiNjIyNDdiOGJhOTNhMjIxODlhIiwiYXV0aG9yaXplIjp7InB1bGwiOnRydWUsInB1c2giOnRydWUsImFkbWluIjp0cnVlfX19.RB0Gs3ILQ0FvYijoVYyDnsbQvJ4LqaXIOkitYKm19hU) ### 服務消費方 ![](https://git.kancloud.cn/repos/owenwangwen/open-capacity-platform/raw/6bd496638277e7acc58344aa1f8d29cc9773ef10/images/screenshot_1592989764436.png?access-token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTc4NDg4NzgsImlhdCI6MTYxNzgwNTY3OCwicmVwb3NpdG9yeSI6Im93ZW53YW5nd2VuXC9vcGVuLWNhcGFjaXR5LXBsYXRmb3JtIiwidXNlciI6eyJ1c2VybmFtZSI6Im93ZW53YW5nd2VuIiwibmFtZSI6Im93ZW4iLCJlbWFpbCI6IjYyNDE5MTM0M0BxcS5jb20iLCJ0b2tlbiI6ImI3MmI4MjM5M2M3ZDFiNjIyNDdiOGJhOTNhMjIxODlhIiwiYXV0aG9yaXplIjp7InB1bGwiOnRydWUsInB1c2giOnRydWUsImFkbWluIjp0cnVlfX19.RB0Gs3ILQ0FvYijoVYyDnsbQvJ4LqaXIOkitYKm19hU) ## RESTful 與 RPC 的區別 在微服務定義中提道,每個小服務運行在自己的進程中,并以輕量級的機制進行通信。這里并沒有明確給出具體的通信方式,只是要求以輕量級的機制進行通信,雖然作者推薦使用 RESTful 作為首選方案,但微服務間通信本身還有另一個輕量級的選擇:以 Dubbo 為代表的 RPC通信方式。 那什么是 RPC 呢?RPC 是遠程過程調用(Remote Procedure Call)的縮寫形式,RPC 與 RESTful 最大的不同是,RPC 采用客戶端(Client) - 服務端(Server) 的架構方式實現跨進程通信,實現的通信協議也沒有統一的標準,具體實現依托于研發廠商的設計。 ![](https://img.kancloud.cn/9d/63/9d635a9bd68d477d1889ffea7f6649a4_873x498.png) 目前開源市場上 RPC 框架有很多,例如 GoogleRPC、Alibaba Dubbo、Facebook?Thrift,每一種產品都有自己的設計與實現方案。 RESTful 與 RPC 對比 ![](https://img.kancloud.cn/77/3b/773bc931967460d80eb60b3eb2160b0e_852x451.png) RESTful 通信更適合調用延時不敏感、短連接的場景。而 RPC 則擁有更好的性能,適用于長連接、低延時系統。兩者本質是互補的,并不存在孰優孰劣。在微服務架構場景下,因為大多數服務都是輕量級的,同時 90%的任務通過短連接就能實現,因此馬丁福勒更推薦使用 RESTful 通信。這只是因為應用場景所決定的,并不代表 RPC 比 RESTful 落后。 ## Dubbo Dubbo 架構中,包含 5 種角色。 * Provider:RPC服務提供者,Provider 是消息的最終處理者。 * Container:容器,用于啟動、停止 Provider 服務。這里的容器并非 Tomcat、Jetty 等 Web 容器,Dubbo 也并不強制要求 Provider 必須具備 Web 能力。Dubbo 的容器是指對象容器,例如 Dubbo 內置的 SpringContainer 容器就提供了利用 Spring IOC 容器管理 Provider 對象的職能。 * Consumer:消費者,調用的發起者。Consumer 需要在客戶端持有 Provider 的通信接口才能完成通信過程。 * Registry:注冊中心,Dubbo 架構中注冊中心與微服務架構中的注冊中心職責類似,提供了 Dubbo Provider 的注冊與發現職能,Consumer通過 Registry 可以獲取Provider 可用的節點實例的 IP、端口等,并產生直接通信。需要注意的是,前面我們講解的 Alibaba Nacos 除了可以作為微服務架構中的注冊中心外,同樣對自家的 Dubbo 提供了 RPC 調用注冊發現的職責,這是其他 Spring Cloud 注冊中心所不具備的功能。 * Monitor:監控器,監控器提供了Dubbo的監控職責。在 Dubbo 產生通信時,Monitor 進行收集、統計,并通過可視化 UI 界面幫助運維人員了解系統進程間的通信狀況。Dubbo Monitor 主流產品有 Dubbo Admin、Dubbo Ops 等。 ## Dubbo與 Nacos共存 ### 服務提供方 #### pom依賴 ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.8</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> ``` #### 配置 ``` server: port: 7000 #服務端口 spring: application: name: user-center #微服務id cloud: nacos: #nacos注冊地址 discovery: server-addr: 127.0.0.1:8848 username: nacos password: nacos dubbo: #dubbo與nacos的通信配置 application: name: user-dubbo #provider在Nacos中的應用id registry: #Provider與Nacos通信地址,與spring.cloud.nacos地址一致 address: nacos://127.0.0.1:8848 protocol: name: dubbo #通信協議名 port: 20880 #配置通信端口,默認為20880 scan: base-packages: com.open.capacity.dubbo ``` ![](https://img.kancloud.cn/12/dc/12dc22bff0cb5ed6364ae113e38f6a49_1477x449.png) 為什么上面配置了 spring.cloud.nacos.discovery.server-addr 還要在下面配置 dubbo.registry.address 呢?前面介紹架構時介紹了,Dubbo 需要依托 Container(容器)對外暴露服務,而這個容器配置與微服務配置是分開的,需要額外占用一個網絡端口20880提供服務。這里還有一個配置點需要特別注意:dubbo.scan.base-packages 代表在 Dubbo 容器啟動時自動掃描 com.open.capacity.dubbo 包下的接口與實現類,并將這些接口信息在Nacos 進行登記,因此 Dubbo 對外暴露的接口必須放在該包下。 ### 定義api層 ``` package com.open.capacity.user.service; import java.util.List; import java.util.Map; import java.util.Set; import com.open.capacity.common.auth.details.LoginAppUser; import com.open.capacity.common.exception.service.ServiceException; import com.open.capacity.common.model.SysRole; import com.open.capacity.common.model.SysUser; import com.open.capacity.common.web.PageResult; import com.open.capacity.common.web.Result; import com.open.capacity.user.model.SysUserExcel; /** * @author 作者 owen * @version 創建時間:2017年11月12日 上午22:57:51 */ public interface SysUserService { LoginAppUser findByUsername(String username) throws ServiceException; LoginAppUser findByMobile(String mobile) throws ServiceException; } ``` ### 用戶服務 ``` import org.apache.dubbo.config.annotation.DubboService; import org.springframework.stereotype.Service; @DubboService public class SysUserServiceImpl implements SysUserService { } ``` 重點是在實現類上需要額外增加 @DubboService注解。@DubboService 是 Provider 注解,說明該類所有方法都是服務提供者,加入該注解會自動將類與方法的信息在 Nacos中注冊為 Provider。 ### 服務消費方 #### pom依賴 ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.8</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> ``` #### 配置 ``` spring: application: name: auth-server cloud: nacos: discovery: server-addr: 127.0.0.1:8848 username: nacos password: nacos server: port: 9000 dubbo: application: name: auth-dubbo registry: address: nacos://127.0.0.1:8848 ``` ### 消費方代碼 ``` @DubboReference private SysUserService SysUserService ; ``` 業務邏輯非常簡單,前文講過不再贅述,關鍵點是第三行 @DubboReference 注解。該注解用在 Consumer 端,說明 SysUserService 是 Dubbo Consumer 接口,Spring 會自動生成 SysUserService接口的代理實現類,并隱藏遠程通信細節,處理流程如下圖所示: ![](https://img.kancloud.cn/d4/d0/d4d019bacafd205cb1d5a1f78b31357c_2120x774.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看