一、项目总体结构
组件说明:
application-1
:应用
1
,模拟应用,提供
http
接口服务。
service-1
:微服务
1
,模拟微服务,提供
dubbo
接口服务。
service-2
:微服务
2
,模拟微服务,提供
dubbo
接口服务。
调用流程:
所有访问系统的请求都要经过网关,网关转发
Http
请求至
application-1
,
application-1
使用
dubbo
调用
service1
完成自身业务,而后sevice1
调用
service2
完成自身业务。至此,完成所有组件贯穿。
架构中application与sevice的区别是什么?
- service提供了基础服务功能;application组装基础服务功能,提供给用户直接可用的业务。
- service服务粒度小、功能基础,不易发生改变;application提供上游业务功能,紧贴业务需求,容易发生改变。
- 形成service支撑application的整体架构,增加多变的application甚至不需要变动service。
二、创建工程
工程整体结构如下:
1、父工程
完整pom依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.nacos</groupId>
<artifactId>service</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.3.RELEASE</version> <type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<!--在添加了该插件之后,当运行“mvn package”进行打包时,会打包成一个可以直接运行的 JAR 文件,使用“java -jar”命令就可以直接运行。这在很大程度上简化了应用的部署,只需要安装了 JRE 就可以运行。-->
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2、实现application1
application1
属于应用层,提供
http
接口服务。
2.1、pom依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>service</artifactId>
<groupId>com.nacos</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>application1</artifactId>
<dependencies>
<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-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
2.2、实现 application-1 功能
仅是一个测试代码
@RestController
@RequestMapping("app1")
public class ApplicationController {
@GetMapping("/service")
public String service(){
return "app1-service";
}
}
2.3、application1 配置
定义
bootstrap.yml
server:
port: 56020
servlet:
context-path: /application1
spring:
application:
name: application1
main:
allow-bean-definition-overriding: true # Spring Boot 2.1 需要设定
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #服务注册发现中心
namespace: 9cd826a1-2bb5-4eeb-a2fb-20cb95ea65f2
cluster‐name: DEFAULT
config:
group: SERVICE_GROUP
server-addr: 127.0.0.1:8848
file‐extension: yaml
namespace: 9cd826a1-2bb5-4eeb-a2fb-20cb95ea65f2
2.4、application1 启动
当Application1启动后,应用application1 将出现在
Nacos
控制台界面。
@SpringBootApplication
@EnableDiscoveryClient
public class Application1 {
public static void main(String[] args) {
SpringApplication.run(Application1.class, args);
}
}
@EnableDiscoveryClient将该应用标识为nacos服务发现客户端
可以在nacos控制台看到application1已经注册到服务中心了:
3、实现 Service1
3.1、定义父工程
定义
service1
父工程,
pom.xml
如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>service</artifactId>
<groupId>com.nacos</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>Service1</artifactId>
<packaging>pom</packaging>
</project>
3.2、定义service1api
为了方便其它服务调用
dubbo
服务,专门定义
api
工程,此工程将作为
jar
被其它工程依赖。
定义
service-1-api
工程,
pom.xml
如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>Service1</artifactId>
<groupId>com.nacos</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>service1api</artifactId>
</project>
定义服务接口:
package com.service1.api;
public interface ConsumerService {
public String service();
}
3.3、实现service1server
添加相关 Maven 依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>Service1</artifactId>
<groupId>com.nacos</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.service1.server</groupId>
<artifactId>service1server</artifactId>
<dependencies>
<dependency>
<groupId>com.service1.api</groupId>
<artifactId>service1api</artifactId>
<version>1.0-SNAPSHOT</version>
</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-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
</dependencies>
</project>
实现
Dubbo
服务
@Service
public class ConsumerServiceImpl implements ConsumerService {
public String service() {
return "Consumer invoke " ;
}
}
注意:使用 @org.apache.dubbo.confifig.annotation.Service 标记 dubbo 服务
配置
Dubbo
服务
Service2
作为
Dubbo
服务消费方配置与服务提供方类似,注意,
service1
不仅是消费方,同时还是服务提供方:
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: 9cd826a1-2bb5-4eeb-a2fb-20cb95ea65f2 #开发环境
config:
server-addr: 127.0.0.1:8848 #配置中心地址,和服务注册地址一样,nacos集服务管理和配置管理于一身
file-extension: yaml
namespace: 9cd826a1-2bb5-4eeb-a2fb-20cb95ea65f2 #开发环境
group: SERVICE_GROUP #xx业务组
dubbo:
scan:
# dubbo 服务扫描基准包
base-packages: com.nacosserver.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 #启动时是否检查依赖的服务
启动服务消费方应用
启动service1server,观察
nacos
服务列表,出现service1服务则说明成功:
![](https://img-blog.csdnimg.cn/20210504214516889.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzMTg5OTYx,size_16,color_FFFFFF,t_70)
3.4、实现 application1调用Service1
现在
service1
已暴露
dubbo
服务并注册到
nacos
中,下边实现
application1
调用
service1
(1)引用service1
在
application1
中引用
service1 ,在其pom.xml
中引入
service1api
的依赖
<dependency>
<groupId>com.service1.api</groupId>
<artifactId>service1api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
在
application1
中引入 spring-cloud-starter-dubbo
依赖,它会根据接口生成代理对象
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
(2)实现远程调用
@RestController
@RequestMapping("app1")
public class ApplicationController {
@org.apache.dubbo.config.annotation.Reference
private ConsumerService consumerService;
@GetMapping("/service")
public String service(){
return "app1-service" + consumerService.service();
}
}
测试看到成功调用service1的service方法:
4、实现 Service2
如上面设计所示,
Service2
需要暴露
dubbo
接口以供
service1
消费
4.1、定义父工程
pom.xml
如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>service</artifactId>
<groupId>com.nacos</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<packaging>pom</packaging>
<modules>
<module>service2api</module>
</modules>
<modelVersion>4.0.0</modelVersion>
<artifactId>service2</artifactId>
</project>
4.2、定义service2api
定义
service2api
工程,
pom.xml
如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>service2</artifactId>
<groupId>com.nacos</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>service2api</artifactId>
</project>
并定义服务接口,
Dubbo
服务接口是服务提供方与消费方的远程通讯契约,通常由普通的
Java
接口(
interface
)来声明,如 ProviderService
接口:
package com.nacos.service2.api;
public interface ProviderService {
String service();
}
4.3、实现service2server
(1)添加依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>service2</artifactId>
<groupId>com.nacos</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>service2server</artifactId>
<dependencies>
<dependency>
<groupId>com.nacos</groupId>
<artifactId>service2api</artifactId>
<version>1.0-SNAPSHOT</version>
</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-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
</dependencies>
</project>
(2)实现 Dubbo 服务
ProviderService
作为暴露的
Dubbo
服务接口,服务提供方
service
2
server
需要将其实现:
import com.nacos.service2.api.ProviderService;
@org.apache.dubbo.config.annotation.Service
public class ProviderServiceImpl implements ProviderService {
public String service() {
return "Provider invoke";
}
}
其中,
@org.apache.dubbo.config.annotation.Service
是
Dubbo
服务注解,仅声明该
Java
服务(本地)实现为 Dubbo
服务。 因此,下一步需要将其配置
Dubbo
服务(远程)。
(
3
)配置
Dubbo
服务
完整的
YAML
配置如下所示:
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: 9cd826a1-2bb5-4eeb-a2fb-20cb95ea65f2 #开发环境
config:
server-addr: 127.0.0.1:8848 #配置中心地址,和服务注册地址一样,nacos集服务管理和配置管理于一身
file-extension: yaml
namespace: 9cd826a1-2bb5-4eeb-a2fb-20cb95ea65f2 #开发环境
group: SERVICE_GROUP #xx业务组
dubbo:
scan:
# dubbo 服务扫描基准包
base-packages: com.nacosserver.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 #启动时是否检查依赖的服务
(
4
)启动服务提供方应用
在引导
Service2Bootstrap
之前,请提前启动
Nacos
服务器。 当Service2Bootstrap启动后,应用 service2将出现在 Nacos
控制台界面。
![](https://img-blog.csdnimg.cn/2021050422273741.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzMTg5OTYx,size_16,color_FFFFFF,t_70)
4.4、实现service1调用service2
在
service1
中添加
service2
的依赖
<dependency>
<groupId>com.nacos</groupId>
<artifactId>service2api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
4.5、实现远程调用
application1调用service1,service1调用service2
@org.apache.dubbo.config.annotation.Service
public class ConsumerServiceImpl implements ConsumerService {
@org.apache.dubbo.config.annotation.Reference
ProviderService providerService;
public String service() {
return "Consumer invoke |" +providerService.service();
}
}
测试:
说明调用时成功的
网关那部分在
另一个demo实现了,只不过是用的spring cloud-gateway,zuul有点老了