一、项目总体结构
组件说明:
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: /application
1
-
spring:
-
application:
-
name: application
1
-
main:
-
allow-bean-definition-overriding: true # Spring Boot
2.
1 需要设定
-
cloud:
-
nacos:
-
discovery:
-
server-addr:
127.0.0.1:8848 #服务注册发现中心
-
namespace:
9cd
826a
1-
2bb
5-
4eeb-a
2fb-
20cb
95ea
65f
2
-
cluster‐name: DEFAULT
-
config:
-
group: SERVICE_GROUP
-
server-addr:
127.0.0.1:8848
-
file‐extension: yaml
-
namespace:
9cd
826a
1-
2bb
5-
4eeb-a
2fb-
20cb
95ea
65f
2
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();
-
}
-
}
测试看到成功调用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
控制台界面。
4.4、实现service1调用service2
在
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有点老了
转载:https://blog.csdn.net/qq_33189961/article/details/116402021
查看评论