Spring-Cloud-Alibaba筆記01-關於遠程調用Dubbo
Nacos既然連上了,當然是用試試遠程調用的東東了!!!
使用Nacos本身的服務調用
好像也挺好用的,參數方法直接調用就可以了,用於訪問遠程Rest接口的。
這個比較簡單,就是發個請求,URL地址使用服務名。
// ====================== 啓動類 ================================================
@EnableDiscoveryClient // 服務發現
@SpringBootApplication
public class DemoApplication {
// 這裏這小段 就是需要的加上的東東了
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
// ====================== 控制測試類 ============================================
private final RestTemplate restTemplate;
@Autowired
public SampleController(RestTemplate restTemplate) {this.restTemplate = restTemplate;}
// 提供的服務
@RestController
class EchoController {
@RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
public String echo(@PathVariable String string) {
return "Hello ,this is xiaohang-demo information : (#^.^#) Nacos Discovery " + string + "Hello " + userName + " " + age + "!";
}
}
// 遠程調用rest接口,使用服務名稱。nacos會自行路由等。
@RequestMapping("/getXhUser")
public String getXhUser() {
return restTemplate.getForObject("http://xh-demo/echo/" + "xiaohangTest", String.class);
}
}
RestTemplate 就是個發送http請求的工具,而這裏的不同用處,就是使用的URL並不是具體地址,而是nacos的服務名稱。而已,就這樣了 。。。。。
Dubbo
簡單說就是,遠程服務調用的。非Rest接口調用。
參考文章:https://segmentfault.com/a/1190000019896723 【超級詳細的】
節點角色說明
節點 | 角色說明 |
---|---|
Provider | 暴露服務的服務提供方 |
Consumer | 調用遠程服務的服務消費方 |
Registry | 服務註冊與發現的註冊中心 |
Monitor | 統計服務的調用次數和調用時間的監控中心 |
Container | 服務運行容器 |
整體步驟
使用的步驟還是很簡單的,管它的實現細節複雜呢。
- 部署啓動Nacos服務;【上一篇有文檔,很簡單】
- 啓動容器,加載,運行服務提供者。
- 服務提供者在啓動時,在註冊中心發佈註冊自己提供的服務。
- 服務消費者在啓動時,在註冊中心訂閱自己所需的服務。
- 服務消費者把服務當做本地調用就可以了。dubbo會自動注入。
具體操作Demo
服務端-Provider
配置:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
######################## dubbo config : ########################
# 微服務治理控制檯(Dubbo): https://edas.console.aliyun.com/#/dubboManage/SPServiceSearchConfig
# dubbo 服務掃描基礎包路徑
dubbo.scan.base-packages= com.example.demo.dubbo.provider
# Dubbo 服務暴露的協議配置,其中子屬性 name 爲協議名稱,port 爲協議端口( -1 表示自增端口,從 20880 開始)
dubbo.protocol.name= dubbo
dubbo.protocol.port= -1
# 掛載到 Spring Cloud 註冊中心
dubbo.registry.address= nacos://192.168.1.180:8848
# 用於服務消費方訂閱服務提供方的應用名稱的列表,若需訂閱多應用,使用 "," 分割。 不推薦使用默認值爲 "*",它將訂閱所有應用。
# 這裏默認使用了當前應用名,請根據需要增加對應的應用名
#dubbo.cloud.subscribed-services= ${provider.application.name}
dubbo.cloud.subscribed-services= *
定義接口
這個接口的定義,在消費的時候也會用到,所有我估計着項目使用的話,這一部分需要作爲公共包引入,或者使用自己的meaven倉庫才行。
public interface UserService {
String test(String message);
}
接口實現
package com.example.demo.dubbo.provider;
// 這個@Service 就是dubbo會掃描並註冊發佈的服務註解了 !!!!!
@Service
public class UserServiceImpl implements UserService {
@Override
public String test(String message) {
return "this is provider service's information:"+message;
}
}
然後? 就沒有了 。。。。。
消費方-Consumer
配置:
跟服務端一樣的,略過。只是消費的話可以不配置掃描包路徑的。
引入服務接口包:重點
這個就是我之前一直想不通,爲什麼消費項目上可以使用提供方的service類進行注入了。
把前一個項目Provider,點一下maven的install。然後就有了一個demo-0.0.1-SNAPSHOT.jar 這麼個的包。
加到項目的lib引用裏面去,然後就可以了。
服務調用:
// 就是這個UserService接口,是在服務Provier裏面定義的接口,這裏要用到才能注入的。
// 就是上面Provier項目的包demo-0.0.1-SNAPSHOT.jar裏面的接口定義
import com.example.demo.dubbo.api.UserService;
@RestController
public class DubboTest {
// 這個註解會自動注入dubbo遠程的服務的
@Reference
private UserService userService;
@RequestMapping("/getDubboTest")
public String getXhUser() {
// 這裏的使用 ,就跟本地調用一樣就可以了,沒有差別!!!!!
return userService.test("Consumer's Test!!");
}
}
好的,操作結束了
測試一下
訪問http://localhost:8081/getDubboTest 這是Consumer的項目的方法了。
返回內容:this is provider service’s information:Consumer’s Test!!
證明,調用成功了!!!!! 收工了!!!!!!
小結一下
主要還是Dubbo的使用,用起來還是很方便的,不管實現的話,只要配置好,當做本身項目的服務直接調用就好。
注入什麼,都是配置好自動的了,不用管!
糾結的:
因爲,消費Consumer需要使用到服務端Provider的接口定義類,所以項目需要應用Provider的包才行。這個比較麻煩!
所有的對外或者對內調用的接口,需要單獨一個包進行管理。
實現與使用(遠程調用) 都基於這個接口包即可!!
2020-04-15 小杭 (⊙o⊙)… 學不動了啊。。。。。。。