小言_互联网的博客

Nacos(服务发现)

419人阅读  评论(0)
 

一、项目总体结构

组件说明:
API 网关 :系统统一入口,屏蔽架构内部结构,统一安全拦截( 该demo不实现网关 ,  可以看这个例子,网关部分使用的Gateway
application-1 :应用 1 ,模拟应用,提供 http 接口服务。
service-1 :微服务 1 ,模拟微服务,提供 dubbo 接口服务。
service-2 :微服务 2 ,模拟微服务,提供 dubbo 接口服务。
 
调用流程:
所有访问系统的请求都要经过网关,网关转发 Http 请求至 application-1 application-1 使用 dubbo 调用 service1 完成自身业务,而后sevice1 调用 service2 完成自身业务。至此,完成所有组件贯穿。
 
架构中applicationsevice的区别是什么?
  • service提供了基础服务功能;application组装基础服务功能,提供给用户直接可用的业务。
  • service服务粒度小、功能基础,不易发生改变;application提供上游业务功能,紧贴业务需求,容易发生改变。
  • 形成service支撑application的整体架构,增加多变的application甚至不需要变动service

 

二、创建工程

工程整体结构如下:

1、父工程

完整pom依赖:


    
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0 </modelVersion>
  6. <groupId>com.nacos </groupId>
  7. <artifactId>service </artifactId>
  8. <version>1.0-SNAPSHOT </version>
  9. <packaging>pom </packaging>
  10. <dependencyManagement>
  11. <dependencies>
  12. <dependency>
  13. <groupId>com.alibaba.cloud </groupId>
  14. <artifactId>spring-cloud-alibaba-dependencies </artifactId>
  15. <version>2.1.0.RELEASE </version>
  16. <type>pom </type>
  17. <scope>import </scope>
  18. </dependency>
  19. <dependency>
  20. <groupId>org.springframework.cloud </groupId>
  21. <artifactId>spring-cloud-dependencies </artifactId>
  22. <version>Greenwich.RELEASE </version>
  23. <type>pom </type>
  24. <scope>import </scope>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.springframework.boot </groupId>
  28. <artifactId>spring-boot-dependencies </artifactId>
  29. <version>2.1.3.RELEASE </version> <type>pom </type>
  30. <scope>import </scope>
  31. </dependency>
  32. </dependencies>
  33. </dependencyManagement>
  34. <build>
  35. <plugins>
  36. <plugin>
  37. <groupId>org.springframework.boot </groupId>
  38. <!--在添加了该插件之后,当运行“mvn package”进行打包时,会打包成一个可以直接运行的 JAR 文件,使用“java -jar”命令就可以直接运行。这在很大程度上简化了应用的部署,只需要安装了 JRE 就可以运行。-->
  39. <artifactId>spring-boot-maven-plugin </artifactId>
  40. </plugin>
  41. </plugins>
  42. </build>
  43. </project>

 

2、实现application1

application1 属于应用层,提供 http 接口服务。
 

2.1、pom依赖


   
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>service </artifactId>
  7. <groupId>com.nacos </groupId>
  8. <version>1.0-SNAPSHOT </version>
  9. </parent>
  10. <modelVersion>4.0.0 </modelVersion>
  11. <artifactId>application1 </artifactId>
  12. <dependencies>
  13. <dependency>
  14. <groupId>com.alibaba.cloud </groupId>
  15. <artifactId>spring-cloud-starter-alibaba-nacos-config </artifactId>
  16. </dependency>
  17. <dependency>
  18. <groupId>com.alibaba.cloud </groupId>
  19. <artifactId>spring-cloud-starter-alibaba-nacos-discovery </artifactId>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.springframework.boot </groupId>
  23. <artifactId>spring-boot-starter-web </artifactId>
  24. </dependency>
  25. </dependencies>
  26. </project>

2.2、实现 application-1 功能

仅是一个测试代码


  
  1. @RestController
  2. @RequestMapping("app1")
  3. public class ApplicationController {
  4. @GetMapping("/service")
  5. public String service(){
  6. return "app1-service";
  7. }
  8. }

2.3、application1 配置

定义 bootstrap.yml

   
  1. server:
  2. port: 56020
  3. servlet:
  4. context-path: /application 1
  5. spring:
  6. application:
  7. name: application 1
  8. main:
  9. allow-bean-definition-overriding: true # Spring Boot 2. 1 需要设定
  10. cloud:
  11. nacos:
  12. discovery:
  13. server-addr: 127.0.0.1:8848 #服务注册发现中心
  14. namespace: 9cd 826a 1- 2bb 5- 4eeb-a 2fb- 20cb 95ea 65f 2
  15. cluster‐name: DEFAULT
  16. config:
  17. group: SERVICE_GROUP
  18. server-addr: 127.0.0.1:8848
  19. file‐extension: yaml
  20. namespace: 9cd 826a 1- 2bb 5- 4eeb-a 2fb- 20cb 95ea 65f 2

 

2.4、application1 启动

Application1启动后,应用application1 将出现在 Nacos 控制台界面。
 

  
  1. @SpringBootApplication
  2. @EnableDiscoveryClient
  3. public class Application1 {
  4. public static void main(String[] args) {
  5. SpringApplication.run(Application1.class, args);
  6. }
  7. }

@EnableDiscoveryClient将该应用标识为nacos服务发现客户端

可以在nacos控制台看到application1已经注册到服务中心了:

 

3、实现 Service1

3.1、定义父工程

定义 service1 父工程, pom.xml 如下:

   
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>service </artifactId>
  7. <groupId>com.nacos </groupId>
  8. <version>1.0-SNAPSHOT </version>
  9. </parent>
  10. <modelVersion>4.0.0 </modelVersion>
  11. <artifactId>Service1 </artifactId>
  12. <packaging>pom </packaging>
  13. </project>

3.2、定义service1api

为了方便其它服务调用 dubbo 服务,专门定义 api 工程,此工程将作为 jar 被其它工程依赖。
定义 service-1-api 工程, pom.xml 如下:

    
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>Service1 </artifactId>
  7. <groupId>com.nacos </groupId>
  8. <version>1.0-SNAPSHOT </version>
  9. </parent>
  10. <modelVersion>4.0.0 </modelVersion>
  11. <artifactId>service1api </artifactId>
  12. </project>
定义服务接口:

    
  1. package com.service1.api;
  2. public interface ConsumerService {
  3. public String service();
  4. }

3.3、实现service1server

添加相关 Maven 依赖:

    
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>Service1 </artifactId>
  7. <groupId>com.nacos </groupId>
  8. <version>1.0-SNAPSHOT </version>
  9. </parent>
  10. <modelVersion>4.0.0 </modelVersion>
  11. <groupId>com.service1.server </groupId>
  12. <artifactId>service1server </artifactId>
  13. <dependencies>
  14. <dependency>
  15. <groupId>com.service1.api </groupId>
  16. <artifactId>service1api </artifactId>
  17. <version>1.0-SNAPSHOT </version>
  18. </dependency>
  19. <dependency>
  20. <groupId>com.alibaba.cloud </groupId>
  21. <artifactId>spring-cloud-starter-alibaba-nacos-config </artifactId>
  22. </dependency>
  23. <dependency>
  24. <groupId>com.alibaba.cloud </groupId>
  25. <artifactId>spring-cloud-starter-alibaba-nacos-discovery </artifactId>
  26. </dependency>
  27. <dependency>
  28. <groupId>com.alibaba.cloud </groupId>
  29. <artifactId>spring-cloud-starter-dubbo </artifactId>
  30. </dependency>
  31. </dependencies>
  32. </project>
实现 Dubbo 服务

    
  1. @Service
  2. public class ConsumerServiceImpl implements ConsumerService {
  3. public String service() {
  4. return "Consumer invoke " ;
  5. }
  6. }
注意:使用 @org.apache.dubbo.confifig.annotation.Service 标记 dubbo 服务
 
 
配置 Dubbo 服务
 
Service2 作为 Dubbo 服务消费方配置与服务提供方类似,注意, service1 不仅是消费方,同时还是服务提供方:

    
  1. server:
  2. port: 56030
  3. spring:
  4. application:
  5. name: service1
  6. main:
  7. allow-bean-definition-overriding: true #Spring Boot 2.1 需要设定,允许覆盖bean
  8. cloud:
  9. nacos:
  10. discovery:
  11. server-addr: 127.0.0.1:8848
  12. namespace: 9cd826a1-2bb5-4eeb-a2fb-20cb95ea65f2 #开发环境
  13. config:
  14. server-addr: 127.0.0.1:8848 #配置中心地址,和服务注册地址一样,nacos集服务管理和配置管理于一身
  15. file-extension: yaml
  16. namespace: 9cd826a1-2bb5-4eeb-a2fb-20cb95ea65f2 #开发环境
  17. group: SERVICE_GROUP #xx业务组
  18. dubbo:
  19. scan:
  20. # dubbo 服务扫描基准包
  21. base-packages: com.nacosserver.service
  22. protocol:
  23. # dubbo 协议
  24. name: dubbo
  25. # dubbo 协议端口
  26. port: 20881
  27. registry:
  28. address: spring-cloud://localhost #相当于nacos的服务地址127.0.0.1:8848
  29. application:
  30. qos-enable: false #dubbo运维服务是否开启
  31. consumer:
  32. check: false #启动时是否检查依赖的服务
启动服务消费方应用
 
启动service1server,观察 nacos 服务列表,出现service1服务则说明成功:
 

3.4、实现 application1调用Service1

现在 service1 已暴露 dubbo 服务并注册到 nacos 中,下边实现 application1 调用 service1

 

(1)引用service1

application1 中引用 service1 ,在其pom.xml 中引入 service1api 的依赖
 

   
  1. <dependency>
  2. <groupId>com.service1.api </groupId>
  3. <artifactId>service1api </artifactId>
  4. <version>1.0-SNAPSHOT </version>
  5. </dependency>
application1 中引入 spring-cloud-starter-dubbo 依赖,它会根据接口生成代理对象

  
  1. <dependency>
  2. <groupId>com.alibaba.cloud </groupId>
  3. <artifactId>spring-cloud-starter-dubbo </artifactId>
  4. </dependency>

(2)实现远程调用


  
  1. @RestController
  2. @RequestMapping("app1")
  3. public class ApplicationController {
  4. @org.apache.dubbo.config.annotation.Reference
  5. private ConsumerService consumerService;
  6. @GetMapping("/service")
  7. public String service(){
  8. return "app1-service" + consumerService.service();
  9. }
  10. }

测试看到成功调用service1的service方法:

 

4、实现 Service2

如上面设计所示, Service2 需要暴露 dubbo 接口以供 service1 消费

 

4.1、定义父工程

pom.xml 如下:

   
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>service </artifactId>
  7. <groupId>com.nacos </groupId>
  8. <version>1.0-SNAPSHOT </version>
  9. </parent>
  10. <packaging>pom </packaging>
  11. <modules>
  12. <module>service2api </module>
  13. </modules>
  14. <modelVersion>4.0.0 </modelVersion>
  15. <artifactId>service2 </artifactId>
  16. </project>

4.2、定义service2api

定义 service2api 工程, pom.xml 如下:

   
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>service2 </artifactId>
  7. <groupId>com.nacos </groupId>
  8. <version>1.0-SNAPSHOT </version>
  9. </parent>
  10. <modelVersion>4.0.0 </modelVersion>
  11. <artifactId>service2api </artifactId>
  12. </project>
并定义服务接口, Dubbo 服务接口是服务提供方与消费方的远程通讯契约,通常由普通的 Java 接口( interface )来声明,如 ProviderService 接口:

   
  1. package com.nacos.service2.api;
  2. public interface ProviderService {
  3. String service();
  4. }

4.3、实现service2server

(1)添加依赖


   
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>service2 </artifactId>
  7. <groupId>com.nacos </groupId>
  8. <version>1.0-SNAPSHOT </version>
  9. </parent>
  10. <modelVersion>4.0.0 </modelVersion>
  11. <artifactId>service2server </artifactId>
  12. <dependencies>
  13. <dependency>
  14. <groupId>com.nacos </groupId>
  15. <artifactId>service2api </artifactId>
  16. <version>1.0-SNAPSHOT </version>
  17. </dependency>
  18. <dependency>
  19. <groupId>com.alibaba.cloud </groupId>
  20. <artifactId>spring-cloud-starter-alibaba-nacos-config </artifactId>
  21. </dependency>
  22. <dependency>
  23. <groupId>com.alibaba.cloud </groupId>
  24. <artifactId>spring-cloud-starter-alibaba-nacos-discovery </artifactId>
  25. </dependency>
  26. <dependency>
  27. <groupId>com.alibaba.cloud </groupId>
  28. <artifactId>spring-cloud-starter-dubbo </artifactId>
  29. </dependency>
  30. </dependencies>
  31. </project>

(2)实现 Dubbo 服务

ProviderService 作为暴露的 Dubbo 服务接口,服务提供方 service 2 server 需要将其实现:

  
  1. import com.nacos.service2.api.ProviderService;
  2. @org.apache.dubbo.config.annotation.Service
  3. public class ProviderServiceImpl implements ProviderService {
  4. public String service() {
  5. return "Provider invoke";
  6. }
  7. }
其中, @org.apache.dubbo.config.annotation.Service Dubbo 服务注解,仅声明该 Java 服务(本地)实现为 Dubbo 服务。 因此,下一步需要将其配置 Dubbo 服务(远程)。
 
 
3 )配置 Dubbo 服务
 
完整的 YAML 配置如下所示:

    
  1. server:
  2. port: 56040
  3. spring:
  4. application:
  5. name: service2
  6. main:
  7. allow-bean-definition-overriding: true #Spring Boot 2.1 需要设定,允许覆盖bean
  8. cloud:
  9. nacos:
  10. discovery:
  11. server-addr: 127.0.0.1:8848
  12. namespace: 9cd826a1-2bb5-4eeb-a2fb-20cb95ea65f2 #开发环境
  13. config:
  14. server-addr: 127.0.0.1:8848 #配置中心地址,和服务注册地址一样,nacos集服务管理和配置管理于一身
  15. file-extension: yaml
  16. namespace: 9cd826a1-2bb5-4eeb-a2fb-20cb95ea65f2 #开发环境
  17. group: SERVICE_GROUP #xx业务组
  18. dubbo:
  19. scan:
  20. # dubbo 服务扫描基准包
  21. base-packages: com.nacosserver.service
  22. protocol:
  23. # dubbo 协议
  24. name: dubbo
  25. # dubbo 协议端口
  26. port: 20891
  27. registry:
  28. address: spring-cloud://localhost #相当于nacos的服务地址127.0.0.1:8848
  29. application:
  30. qos-enable: false #dubbo运维服务是否开启
  31. consumer:
  32. check: false #启动时是否检查依赖的服务
4 )启动服务提供方应用
 
在引导 Service2Bootstrap 之前,请提前启动 Nacos 服务器。 当Service2Bootstrap启动后,应用 service2将出现在 Nacos 控制台界面。
 
 

4.4、实现service1调用service2

service1 中添加 service2 的依赖
 

    
  1. <dependency>
  2. <groupId>com.nacos </groupId>
  3. <artifactId>service2api </artifactId>
  4. <version>1.0-SNAPSHOT </version>
  5. </dependency>

4.5、实现远程调用

application1调用service1service1调用service2


   
  1. @org.apache.dubbo.config.annotation.Service
  2. public class ConsumerServiceImpl implements ConsumerService {
  3. @org.apache.dubbo.config.annotation.Reference
  4. ProviderService providerService;
  5. public String service() {
  6. return "Consumer invoke |" +providerService.service();
  7. }
  8. }

测试:

说明调用时成功的
 
 
网关那部分在 另一个demo实现了,只不过是用的spring cloud-gateway,zuul有点老了
 
 
 
 
 
 
 
 
 

 


转载:https://blog.csdn.net/qq_33189961/article/details/116402021
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场