系統架構:
這里只演示以下組件,其他組件的使用和SpringCloud一樣
application-1 :應用1,模擬應用,提供http接口服務。
service-1 :微服務1,模擬微服務,提供dubbo接口服務。
service-2 :微服務2,模擬微服務,提供dubbo接口服務。
架構中 application與sevice的區別:
service 提供了基礎服務功能;application組裝基礎服務功能,提供給用戶直接可用的業務。
service 服務粒度小、功能基礎,不易發生改變;application提供上游業務功能,緊貼業務需求,容易發生改變。
形成 service支撐application的整體架構,增加多變的application甚至不需要變動service。
工程結構:
創建父工程:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.3.RELEASE</version> </parent> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring-cloud.version>Greenwich.RELEASE</spring-cloud.version> <spring-cloud-alibaba.version>2.1.0.RELEASE</spring-cloud-alibaba.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${spring-cloud-alibaba.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
創建子模塊application1:dubbo服務消費者
<dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
1.實現 application1 的功能
@RestController public class Application1Controller { @GetMapping("/service") public String service() { return "test"; } }
2.application1 的配置,定義bootstrap.yml
server: port: 56020 servlet: context-path: /application1 spring: application: name: application1 main: allow-bean-definition-overriding: true #Spring Boot 2.1 需要設定,允許覆蓋bean cloud: nacos: discovery: server-addr: 127.0.0.1:8848 namespace: b0818a15-92f4-438b-ab16-1b0d13c1d225 #開發環境 config: server-addr: 127.0.0.1:8848 #配置中心地址,和服務注冊地址一樣,nacos集服務管理和配置管理於一身 file-extension: yaml namespace: b0818a15-92f4-438b-ab16-1b0d13c1d225 #開發環境 group: NACOS_MICROSERVICE_GROUP #xx業務組
3.application1 啟動類
@SpringBootApplication @EnableDiscoveryClient public class Application1Bootstrap { public static void main(String[] args) { SpringApplication.run(Application1Bootstrap.class, args); } }
4.啟動服務,訪問 http://localhost:56020/application1/service 進行測試
創建子模塊service1:
1.定義service-1-api:方便其它服務調用dubbo服務,專門定義api工程,此工程將作為jar被其它工程依賴。
定義服務接口
public interface ConsumerService { String service(); }
2.定義service-1-server:實現 service-1-api 定義的服務接口
<dependencies> <dependency> <groupId>pers.fgy.nacos</groupId> <artifactId>service‐1‐api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-dubbo</artifactId> </dependency> </dependencies>
實現 Dubbo 服務
注意:使用 @org.apache.dubbo.config.annotation.Service 標記 dubbo 服務
@org.apache.dubbo.config.annotation.Service public class ConsumerServiceImpl implements ConsumerService { @Override public String service() { return "Consumer invoke "; } }
配置 Dubbo 服務
server:
port: 56030
spring:
application:
name: service1
main:
allow-bean-definition-overriding: true #Spring Boot 2.1 需要設定,允許覆蓋bean
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: b0818a15-92f4-438b-ab16-1b0d13c1d225 #開發環境
config:
server-addr: 127.0.0.1:8848 #配置中心地址,和服務注冊地址一樣,nacos集服務管理和配置管理於一身
file-extension: yaml
namespace: b0818a15-92f4-438b-ab16-1b0d13c1d225 #開發環境
group: NACOS_MICROSERVICE_GROUP #xx業務組
dubbo:
scan:
# dubbo 服務掃描基准包
base-packages: pers.fgy.nacos.service
protocol:
# dubbo 協議
name: dubbo
# dubbo 協議端口
port: 20881
registry:
address: spring-cloud://localhost #相當於nacos的服務地址127.0.0.1:8848
application:
qos-enable: false #dubbo運維服務是否開啟
consumer:
check: false #啟動時是否檢查依賴的服務
啟動服務消費方應用
@SpringBootApplication @EnableDiscoveryClient public class Service1Bootstrap { public static void main(String[] args) { SpringApplication.run(Service1Bootstrap.class, args); } }
當 Service1Bootstrap 啟動后,應用 service1 將出現在 Nacos 控制台界面。
實現 application1調用Service1:
在application1中引用service1
<dependency> <groupId>pers.fgy.nacos</groupId> <artifactId>service‐1‐api</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
引入 spring-cloud-starter-dubbo 依賴,它會根據接口生成代理對象
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-dubbo</artifactId> </dependency>
實現遠程調用
@RestController public class Application1Controller { @org.apache.dubbo.config.annotation.Reference private ConsumerService consumerService; @GetMapping("/service") public String service() { return "test" + consumerService.service(); } }
注意:這里的 @Reference 注解是 org.apache.dubbo.config.annotation.Reference
請求:http://localhost:56020/application1/service consumerService 正常生成代理對象,service1被調用。
創建子模塊service2:
1.定義service-2-api:
定義服務接口
public interface ProviderService { String service(); }
2.定義service-2-server
<dependencies> <dependency> <groupId>pers.fgy.nacos</groupId> <artifactId>service-2-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-dubbo</artifactId> </dependency> </dependencies>
實現 Dubbo 服務
@org.apache.dubbo.config.annotation.Service public class ProviderServiceImpl implements ProviderService { @Override public String service() { return "Provider invoke"; } }
配置 Dubbo 服務
server:
port: 56040
spring:
application:
name: service2
main:
allow-bean-definition-overriding: true #Spring Boot 2.1 需要設定,允許覆蓋bean
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: b0818a15-92f4-438b-ab16-1b0d13c1d225 #開發環境
config:
server-addr: 127.0.0.1:8848 #配置中心地址,和服務注冊地址一樣,nacos集服務管理和配置管理於一身
file-extension: yaml
namespace: b0818a15-92f4-438b-ab16-1b0d13c1d225 #開發環境
group: NACOS_MICROSERVICE_GROUP #xx業務組
dubbo:
scan:
# dubbo 服務掃描基准包
base-packages: pers.fgy.nacos.service
protocol:
# dubbo 協議
name: dubbo
# dubbo 協議端口
port: 20891
registry:
address: spring-cloud://localhost #相當於nacos的服務地址127.0.0.1:8848
application:
qos-enable: false #dubbo運維服務是否開啟
consumer:
check: false #啟動時是否檢查依賴的服務
啟動服務提供方應用
@SpringBootApplication @EnableDiscoveryClient public class Service2Bootstrap { public static void main(String[] args) { SpringApplication.run(Service2Bootstrap.class, args); } }
實現service1調用service2:
在service1中添加service2的依賴
<dependency> <groupId>pers.fgy.nacos</groupId> <artifactId>service-2-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
實現遠程調用
@org.apache.dubbo.config.annotation.Service public class ConsumerServiceImpl implements ConsumerService { @org.apache.dubbo.config.annotation.Reference private ProviderService providerService; @Override public String service() { // return "Consumer invoke "; return "Consumer invoke | " + providerService.service(); } }
服務啟動后立即請求:http://localhost:56020/application1/service 可能會出現錯誤,是因為服務還沒有注冊成功,過一會再訪問即可