一、项目总体结构
组件说明: API 网关 :系统统一入口,屏蔽架构内部结构,统一安全拦截( 该demo不实现网关 ) 。 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.ymlserver:
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服务则说明成功:
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();
}
}
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
控制台界面。
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();
}
}
测试:
说明调用时成功的
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。