此係列文章將會描述Java框架Spring Boot、服務治理框架Dubbo、應用容器引擎Docker,及使用Spring Boot集成Dubbo、Mybatis等開源框架,其中穿插着Spring Boot中日誌切面等技術的實現,然後通過gitlab-CI以持續集成爲Docker鏡像。
本文爲此Spring Boot通過使用起步依賴dubbo-spring-boot-starter及自動裝配的方式集成Dubbo。
本系列文章中所使用的框架版本爲Spring Boot 2.0.3-RELEASE,Spring 5.0.7-RELEASE,Dubbo 2.6.2。
Spring Boot
Spring Boot旨在讓開發人員使用最少的配置,儘可能快地着手開發並運行一個應用。Spring Boot框架從本質上來說就是Spring,但通過自動配置和起步依賴的方式將開發人員從繁重的配置中解放出來,專注於業務邏輯的實現。Spring Boot 的特性見微服務框架(一)Spring Boot + Dubbo + Docker 框架特性簡述
Profile運行環境配置
Spring Boot簡化了開發人員需要的模板配置,因此我們只需要引入application.properties/application.yml即可。
在多環境配置下常使用
application.properties
只配置spring.profiles.active
屬性,以起選擇對應環境的配置文件的作用
如上中,application.properties
只需要配置spring.profiles.active = dev
來選擇配置文件,Spring Boot會自動加載config包下application-dev.properties
的配置
在運行jar包或docker鏡像時只需要設置
spring.profiles.active
運行變量jar:
java -jar provider.jar --spring.profiles.active=dev
docker:-e "SPEING_PROFILES_ACTIVE=dev"
Dubbo
Dubbo是一個由阿里巴巴開源的高性能、基於Java的RPC框架。與許多RPC系統一樣,dubbo基於定義服務的思想,指定可以使用其參數和返回類型來遠程調用的方法。在服務器端,Provider實現此接口並運行dubbo服務器來處理客戶端調用。在客戶端,Customer有一個提供與服務器相同的方法的存根。
Dubbo Spring Boot 項目致力於簡化 Dubbo RPC 框架在 Spring Boot 應用場景的開發。同時也整合了 Spring Boot 自動裝配及生產就緒的特性。
依賴引入及接口定義
Maven中引入dubbo-spring-boot-starter
的起步依賴至pom.xml
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
依賴關係:
版本 | Java | Spring Boot | Dubbo |
---|---|---|---|
0.2.0 | 1.8+ | 2.0.x | 2.6.2+ |
0.1.1 | 1.7+ | 1.5.x | 2.6.2+ |
Dubbo RPC API:
public interface DemoService {
String saySomething(String word);
}
Dubbo Provider
1.編寫Spring Boot啓動類
Dubbo的服務容器是一個 standalone 的啓動程序,不需要Web容器
@SpringBootApplication
public class Starter {
public static void main(String[] args) {
new SpringApplicationBuilder(Starter.class)
.web(WebApplicationType.NONE) // 非 Web 應用
.run(args);
}
}
2.實現DemoService
接口
@Service(version = "${demo.service.version}")
public class DemoServiceImpl implements DemoService {
@Override
public String saySomething(String word) {
return StringUtils.isNotEmpty(word) ? word : "Say you won't let go";
}
}
3.spring boot配置文件
Spring Boot的自動裝配及起步依賴使開發人員只需配置文件,而無需重複使用模板定義
application.properties/application.yml
# Spring boot application
spring.application.name = dubbo-provider-demo
server.port = 9090
# Service version
demo.service.version = 1.0.0
# Base packages to scan Dubbo Components (e.g @Service , @Reference)
dubbo.scan.basePackages = org.spring.boot.dubbo.provider
# Dubbo Config properties
## ApplicationConfig Bean
dubbo.application.id = dubbo-provider-demo
dubbo.application.name = dubbo-provider-demo
## ProtocolConfig Bean
dubbo.protocol.id = dubbo
dubbo.protocol.name = dubbo
dubbo.protocol.port = 9900
## RegistryConfig Bean
dubbo.registry.id = my-registry
dubbo.registry.address = zookeeper://127.0.0.1:2181
注:啓動消費者時需啓動對應的註冊中心,否則服務會啓動失敗
Dubbo Customer
使用Spring Boot框架構建Web應用時需引入
spring-boot-starter-web
的起步依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
1.編寫Spring Boot啓動類(Web應用)
@SpringBootApplication(scanBasePackages = "org.spring.boot.dubbo.consumer.controller")
public class Starter {
public static void main(String[] args) {
new SpringApplicationBuilder(Starter.class)
.web(WebApplicationType.SERVLET).run(args);
}
}
2.通過 @Reference
注入 DemoService
下述配置中消費者爲直連生產者,未經過註冊中心(
@Reference
中url
參數若已配置則直連對應生產者,若未配置則經過配置文件中dubbo.registry.address
參數連接註冊中心,獲取相應的生產者信息)
@RestController
public class DemoController {
@Reference(version = "${demo.service.version}",
url = "dubbo://localhost:9900")
private DemoService demoService;
@RequestMapping("/saySomething")
public String sayHello(@RequestParam String name) {
return demoService.saySomething(name);
}
}
3.spring boot配置文件
Spring Boot的自動裝配及起步依賴使開發人員只需配置文件,而無需重複使用模板定義
application.properties/application.yml
# Spring boot application
spring.application.name = dubbo-consumer-demo
server.port = 9090
# Service version
demo.service.version = 1.0.0
# Base packages to scan Dubbo Components (e.g @Service , @Reference)
dubbo.scan.basePackages = org.spring.boot.dubbo.consumer.controller
# Dubbo Config properties
## ApplicationConfig Bean
dubbo.application.id = dubbo-consumer-demo
dubbo.application.name = dubbo-consumer-demo
## ProtocolConfig Bean
dubbo.protocol.id = dubbo
dubbo.protocol.name = dubbo
dubbo.protocol.port = 9901
## RegistryConfig Bean
dubbo.registry.id = my-registry
dubbo.registry.address = zookeeper://localhost:2181
參考資料: