Nacos服务发现-四、Spring Cloud Alibaba综合集成架构演示

前面说到Spring Cloud是一个较为全面的微服务框架集,集成了如服务注册发现、配置中心、消息总线、负载均衡、断路器、API网关等功能实现。

Dubbo在国内有着非常大的用户群体,但是其周边设施与组件相对来说并不那么完善。很多开发者用户又很希望享受Spring Cloud的生态,因此也会有一些Spring Cloud与Dubbo一起使用的案例与方法出现,但是一直以来大部分Spring Cloud整合Dubbo的使用方案都不完善。直到Spring Cloud Alibaba的出现,才得以解决这样的问题。

此前,已经学习如何使用Spring Cloud Alibaba来集成Nacos与Spring Cloud应用,并且在此之下可以如传统的Spring Cloud应用一样地使用Ribbon或Feign来微服务之间的协作。由于Feign是基于Http Restful的调用,在高并发下的性能不够理想。

所以此案例将使用Dubbo通过RPC对服务进行调用~

PS:网上经常会发现Spring Cloud与阿里巴巴的Dubbo进行选择对比,这样做其实不是很妥当,前者是一套较为完整的架构方案,而Dubbo只是服务治理与RPC实现方案。

4.1 总体结构

系统架构图如下:

image-20210118115704951.png

组件说明:

  • API网关 :系统统一入口,屏蔽架构内部结构,统一安全拦截,采用Zuul实现。
  • 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。

4.2 工程结构

采用Maven工程,结构如下:

nacos‐discovery‐dubbo       整体父工程
├─api‐gateway               API网关,端口:56010
├─application               应用1,端口:56020
├─myservice                 服务1父工程
│ ├─myservice‐api            服务1API
│ └─myservice‐server         服务1实现,端口:56030
└─yourservice               服务2父工程
  ├─yourservice‐api          服务2API
  └─yourservice‐server       服务2实现,端口:56040

4.3 创建工程结构

4.3.1 创建父工程

image-20210118142306113.png
image-20210119192733675.png
image-20210118142441357.png

4.3.2 创建网关模块

image-20210118143444539.png
image-20210118143509571.png

4.3.3 创建应用模块

image-20210119193110629.png
image-20210119193153316.png

4.3.4 创建myservice模块

image-20210119193352586.png
image-20210119193419360.png

4.3.5 创建myservice-api子模块

image-20210119193512943.png
image-20210119193547416.png

4.3.6 创建myservice-server子模块

image-20210119193651722.png
image-20210119193739494.png

4.3.7 创建yourservice模块

image-20210119193820887.png
image-20210119193847377.png

4.3.8 创建yourservice-api子模块

image-20210119193942505.png
image-20210119194018041.png

4.3.9 创建yourservice-server子模块

image-20210119194446259.png
image-20210119194523119.png

4.3.10 创建后的工程

image-20210119194643624.png

4.4 添加父工程依赖

pom.xml



    4.0.0

    net.zhi365
    nacos-discovery-dubbo
    pom
    1.0
    
        api-gateway
        application
        myservice
        yourservice
    

    
        UTF-8
        UTF-8
        1.8
        Greenwich.RELEASE
        2.1.1.RELEASE
        2.1.3.RELEASE
    

    
        
            
            
                org.springframework.cloud
                spring-cloud-dependencies
                ${spring-cloud.version}
                pom
                import
            

            
            
                com.alibaba.cloud
                spring-cloud-alibaba-dependencies
                ${spring-cloud-alibaba.version}
                pom
                import
            

            
            
                org.springframework.boot
                spring-boot-dependencies
                ${spring-boot.version}
                pom
                import
            
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    

4.5 实现application

4.5.1 添加依赖

pom.xml



    
        nacos-discovery-dubbo
        net.zhi365
        1.0
    
    4.0.0

    application

    
        
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-discovery
        

        
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-config
        

        
            org.springframework.boot
            spring-boot-starter-web
        
    

4.5.2 编写启动类

ApplicationBootstrap.java

package net.zhi365.application;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * @author Xin.li
 * @date 2021-01-19 20:02
 */
@SpringBootApplication
@EnableDiscoveryClient
public class ApplicationBootstrap {
    public static void main(String[] args) {
        SpringApplication.run( ApplicationBootstrap.class, args );
    }
}

4.5.3 配置文件

bootstrap.yml

server:
  # 启动端口,命令行注入
  port: 56020
  servlet:
    context-path: /application1
spring:
  application:
    name: application1
  main:
    # Spring Boot 2.1 需要设定
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: 470cd824-4b0a-4001-bcac-8491cf2987f8
        cluster-name: DEFAULT
      config:
        # 配置中心地址
        server-addr: 127.0.0.1:8848
        file-extension: yaml
        # 开发环境
        namespace: 470cd824-4b0a-4001-bcac-8491cf2987f8
        # NACOS_DISCOVERY_DUBBO业务组
        group: NACOS_DISCOVERY_DUBBO

4.5.4 控制层

ApplicationController.java

package net.zhi365.application.web;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author Xin.li
 * @date 2021-01-19 20:07
 */
@RestController
public class ApplicationController {
    @GetMapping("/applicationService")
    public String service(){
        return "applicationService";
    }
}

4.5.5 查看Nacos控制台

image-20210119201131600.png

4.5.6 访问服务

启动程序后,访问:http://localhost:56020/application/service/,得到如下结果,表示服务正常

image-20210119201153726.png

4.6 实现myservice

4.6.1 定义myservice-api

为了方便其它服务调用dubbo服务,专门定义api工程,此工程将作为jar被其它工程依赖。

MyService.java

package net.zhi365.myservice.api;

/**
 * @author Xin.li
 * @date 2021-01-19 20:13
 */
public interface MyService {
    public String service();
}

4.6.2 实现myservice-server

pom.xml



    
        myservice
        net.zhi365
        1.0
    
    4.0.0

    myservice-server

    
        
            net.zhi365
            myservice-api
            1.0
            compile
        

        
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-discovery
        

        
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-config
        
        
        
            com.alibaba.cloud
            spring-cloud-starter-dubbo
        
    

MyServiceImpl.java

package net.zhi365.myservice.service;

import net.zhi365.myservice.api.MyService;
import org.apache.dubbo.config.annotation.Service;

/**
 * @author Xin.li
 * @date 2021-01-19 20:25
 */
@Service
public class MyServiceImpl implements MyService {
    public String service() {
        return "MyService invoke~";
    }
}

注:使用@org.apache.dubbo.config.annotation.Service标记dubbo服务

4.6.3 配置Dubbo服务

YourService作为Dubbo服务消费方配置与服务提供方类似,注意,MyService不仅是消费方,同时还是服务提供方:

server:
  # 启动端口 命令行注入
  port: ${port:56030}

spring:
  application:
    name: myservice
  main:
    # Spring Boot 2.1 需要设定
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        namespace: 470cd824-4b0a-4001-bcac-8491cf2987f8
        cluster-name: DEFAULT
      config:
        # 配置中心地址
        server-addr: localhost:8848
        file-extension: yaml
        # 开发环境
        namespace: 470cd824-4b0a-4001-bcac-8491cf2987f8
        # NACOS_DISCOVERY_DUBBO业务组
        group: NACOS_DISCOVERY_DUBBO
dubbo:
  scan:
    # dubbo 服务扫描基准包
    base-packages: net.zhi365.myservice
  protocol:
    # dubbo 协议
    name: dubbo
    # dubbo 协议端口
    port: ${dubbo_port:20881}
  registry:
    address: nacos://localhost:8848
  application:
    # dubbo 运维服务是否开启
    qos-enable: false
  consumer:
    # 启动时就否检查依赖的服务
    check: false

以上 YAML 内容,dubbo开头的为dubbo服务 的配置:

  • dubbo.scan.base-packages : 指定 Dubbo 服务实现类的扫描基准包,将@org.apache.dubbo.config.annotation.Service注解标注的service暴露为dubbo服务。

  • dubbo.protocol : Dubbo 服务暴露的协议配置,其中子属性 name 为协议名称, port 为dubbo协议端口可以指定多协议,如:dubbo.protocol.rmi.port=1099

  • dubbo.registry : Dubbo 服务注册中心配置,其中子属性 address 的值 "nacos://localhost:8848",说明dubbo服务注册到nacos

    相当于原生dubbo的xml配置中的

上半部分为SpringCloud的相关配置:

  • spring.application.name : Spring应用名称,用于 Spring Cloud 服务注册和发现。
该值在 Dubbo Spring Cloud 加持下被视作 dubbo.application.name ,因此,无需再显示地配置dubbo.application.name
  • spring.cloud.nacos.discovery : Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口。
  • spring.cloud.nacos.config : Nacos 配置中心配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口。

4.6.4 启动类

package net.zhi365.myservice;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * @author Xin.li
 * @date 2021-01-19 20:48
 */
@SpringBootApplication
@EnableDiscoveryClient
public class MyServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyServiceApplication.class, args);
    }
}

4.6.5 查看Nacos控制台

当 MyServiceApplication启动后,应用 myservice将出现在 Nacos 控制台界面,如下图:

image-20210119212254249.png

4.7 实现application调用myservice

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

4.7.1 在application中引入依赖



    com.alibaba.cloud
    spring-cloud-starter-dubbo



    net.zhi365
    myservice-api
    1.0

注:引入 spring-cloud-starter-dubbo依赖,它会根据接口生成代理对象

4.7.2 修改Controller

package net.zhi365.application.web;

import net.zhi365.myservice.api.MyService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author Xin.li
 * @date 2021-01-19 20:07
 */
@RestController
public class ApplicationController {

    @Reference
    private MyService myService;

    @GetMapping("/service")
    public String service(){
        return "Test:" +myService.service();
    }
}

注:这里的@Reference 注解是org.apache.dubbo.config.annotation.Reference

4.7.3 查看Nacos控制台

image-20210119213436455.png

发现application与myservice已经全都注册成功

4.7.4 测试

访问:http://localhost:56020/application/service/

image-20210119213825849.png

表示调用成功

4.8 实现yourservice

4.8.1 定义yourservice-api

为了方便其它服务调用dubbo服务,专门定义api工程,此工程将作为jar被其它工程依赖。

YourService.java

package net.zhi365.youservice.api;

/**
 * @author Xin.li
 * @date 2021-01-19 21:52
 */
public interface YourService {
    public String service();
}

4.8.2 实现yourservice-server

pom.xml



    
        yourservice
        net.zhi365
        1.0
    
    4.0.0

    yourservice-server

    
        
            net.zhi365
            yourservice-api
            1.0
            compile
        

        
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-discovery
        

        
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-config
        
        
        
            com.alibaba.cloud
            spring-cloud-starter-dubbo
        
    

以上依赖 artifact 说明如下:

  • yourservice-api:提供YourService接口的artifact
  • spring-boot-starter-web:Spring Boot starter artifact ,间接引入spring-boot artifact
  • spring-cloud-starter-dubbo:Dubbo Spring Cloud Starter artifact ,间接引入 dubbo-spring-bootstarter
    等 artifact
  • spring-cloud-starter-alibaba-nacos-discovery:Nacos Spring Cloud 服务注册与发现 artifact

YourServiceImpl.java

package net.zhi365.yourservice.service;

import net.zhi365.youservice.api.YourService;
import org.apache.dubbo.config.annotation.Service;

/**
 * @author Xin.li
 * @date 2021-01-19 22:14
 */
@Service
public class YourServiceImpl implements YourService {
    public String service() {
        return "YourService invoke";
    }
}

4.8.3 实现 Dubbo服务

在暴露 Dubbo 服务方面,推荐开发人员外部化配置的方式,即指定 Java 服务实现类的扫描基准包。

Dubbo Spring Cloud 继承了 Dubbo Spring Boot 的外部化配置特性,也可以通过标注@DubboComponentScan 来实现基准包扫描。

同时,Dubbo 远程服务需要暴露网络端口,并设定通讯协议,完整的 YAML 配置如下所示:

server:
  # 启动端口 命令行注入
  port: ${port:56040}
spring:
  application:
    name: yourservice
  main:
    # Spring Boot 2.1 需要设定
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        namespace: 470cd824-4b0a-4001-bcac-8491cf2987f8
        cluster-name: DEFAULT
      config:
        # 配置中心地址
        server-addr: 127.0.0.1:8848
        file-extension: yaml
        # 开发环境
        namespace: 470cd824-4b0a-4001-bcac-8491cf2987f8
        # NACOS_DISCOVERY_DUBBO业务组
        group: NACOS_DISCOVERY_DUBBO
dubbo:
  scan:
    # dubbo 服务扫描基准包
    base-packages: net.zhi365.yourservice
  protocol:
    # dubbo 协议
    name: dubbo
    # dubbo 协议端口
    port: ${dubbo_port:20882}
  registry:
    address: nacos://localhost:8848
  application:
    # dubbo 运维服务是否开启
    qos-enable: false
  consumer:
    # 启动时就否检查依赖的服务
    check: false

4.8.4 启动类

package net.zhi365.yourservice;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * @author Xin.li
 * @date 2021-01-19 22:29
 */
@SpringBootApplication
@EnableDiscoveryClient
public class YourServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(YourServiceApplication.class, args);
    }
}

4.8.5 查看Nacos控制台

当 YourServiceApplication启动后,应用 yourservice将出现在 Nacos 控制台界面,如下图:

image-20210119225915121.png

4.9 实现myservice调用yourservice

4.9.1 在myservice中引用yourservice


    net.zhi365
    yourservice-api
    1.0

4.9.2 实现远程调用

MyServiceImpl.java

package net.zhi365.myservice.service;

import net.zhi365.myservice.api.MyService;
import net.zhi365.youservice.api.YourService;
import org.apache.dubbo.config.annotation.Reference;
import org.apache.dubbo.config.annotation.Service;

/**
 * @author Xin.li
 * @date 2021-01-19 20:25
 */
@Service
public class MyServiceImpl implements MyService {
    @Reference
    private YourService yourService;

    public String service() {
        return "MyService invoke~|" +yourService.service();
    }
}

4.9.3 测试

http://localhost:56020/application/service/

image-20210119230452015.png

4.10 实现api-gateway

4.10.1 Zuul介绍

什么是网关?

原来的单体架构,所有的服务都是本地的,UI可以直接调用,现在按功能拆分成独立的服务,一般都跑在独立的虚拟机上的 Java进程中。客户端UI如何访问?他的后台有N个服务,前台就需要记住管理N个服务,一个服务下线/更新/升级,前台就要重新部署,这明显不符合拆分的理念,特别当前台是移动应用的时候,通常业务变化的节奏更快。另外,N个小服务的调用也是一个不小的网络开销。

image-20210120002921356.png

有了网关作为服务统一入口,就可以避免上述问题,不仅如此,服务网关是在微服务前边设置一道屏障,请求先到服务网关,网关会对请求进行过虑、校验、路由等处理。有了服务网关可以提高微服务的安全性,网关校验请求的合法性,请求不合法将被拦截,拒绝访问。

  • 提供统一服务入口,让微服务对前台透明
  • 聚合后台的服务,节省流量,提升性能
  • 提供安全,过滤,流控等API管理功能

什么是Zuul?

Spring Cloud Zuul是整合Netflix公司的Zuul开源项目实现的微服务网关,它实现了请求路由、负载均衡、校验过虑等 功能。

官方:https://github.com/Netflix/zuul

Zuul与Nginx怎么配合使用?

Zuul与Nginx在实际项目中需要配合使用,如下图,Nginx的作用是反向代理、负载均衡,Zuul的作用是保障微服务的安全访问,拦截微服务请求,校验合法性及负载均衡。

image-20210120003318250.png

4.10.2 搭建网关工程

(1) 添加依赖



    
        nacos-discovery-dubbo
        net.zhi365
        1.0
    
    4.0.0

    api-gateway

    
        
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-discovery
        

        
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-config
        

        
            org.springframework.boot
            spring-boot-starter-web
        

        
            org.springframework.cloud
            spring-cloud-starter-netflix-zuul
        

        
            org.springframework.cloud
            spring-cloud-starter-openfeign
        
    

(2) 编写本地配置文件

bootstrap.yml

server:
  # 启动端口 命令行注入
  port: 56010

spring:
  application:
    name: api-gateway
  main:
    # Spring Boot 2.1 需要设定
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        namespace: 470cd824-4b0a-4001-bcac-8491cf2987f8
        cluster-name: DEFAULT
      config:
        # 配置中心地址
        server-addr: localhost:8848
        file-extension: yaml
        # 开发环境
        namespace: 470cd824-4b0a-4001-bcac-8491cf2987f8
        # NACOS_DISCOVERY_DUBBO业务组
        group: NACOS_DISCOVERY_DUBBO

(3) 在Nacos控制台编写路由配置文件

image-20210120004807290.png
image-20210120005304232.png
zuul:
  routes:
    # 服务名
    application:
      stripPrefix: false
      path: /application/**

(4) 启动类

package net.zhi365.apigateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;

/**
 * @author Xin.li
 * @date 2021-01-20 0:54
 */
@SpringBootApplication
@EnableDiscoveryClient
@EnableZuulProxy
public class ApiGatewayBootstrap {
    public static void main(String[] args) {
        SpringApplication.run(ApiGatewayBootstrap.class, args);
    }
}

(5) 查看Nacos控制台

启动服务,查看Nacos控制台,如下图:

image-20210120095151774.png

(6) 测试

通过网关(api-gateway)请求application应用,application的业务实现又贯穿myservice、yourservice

访问http://127.0.0.1:56010/application/service ,将得到如下结果:

image-20210120124459669.png

你可能感兴趣的:(Nacos服务发现-四、Spring Cloud Alibaba综合集成架构演示)