3.Soul网关接入与验证

简介: 本章节在前两章基础上引入Soul网关,讲解如何将Provider和Consumer应用接入Soul。通过添加依赖、使用@SoulSpringMvcClient注解及配置文件实现服务注册,并验证网关路由与通信功能,完成Dubbo与HTTP服务的统一管理。

此章节将基于上一章节基础之上,引入Soul网关,至于Soul网关是干什么的,怎么做的,我们会在后续章节讲解,1-3章节侧重于搭建应用。

本章节的Soul网关接入,如果你1,2章节都是和我保持一致,那么只需要直接启动Soul网关即可,但是对应的provider,consumer应用是需要额外的代码接入的。

开发环境和第二章保持一致。

3.1 提供者接入Soul

3.1.1 pom

<dependency>
  <groupId>org.dromara</groupId>
  <artifactId>soul-spring-boot-starter-client-alibaba-dubbo</artifactId>
  <version>2.2.0</version>
</dependency>
<dependency>
  <groupId>org.dromara</groupId>
  <artifactId>soul-spring-boot-starter-client-springmvc</artifactId>
  <version>2.2.0</version>
</dependency>
<dependency>
  <groupId>org.dromara</groupId>
  <artifactId>soul-client-springmvc</artifactId>
  <version>2.2.0</version>
</dependency>

3.1.2 Controller


与之前不同的是,这里我们会在Controller增加一个注解,@SoulSpringMvcClient,标注其注册成为一个SoulSpringMvcClient对象。这里有两种方式,一种是全局,一种是下面示例文件的局部,我会在 3.1.3 配置文件具体讲解二者实现上的差异性。

其中@SoulSpringMvcClient(path = "/consumer/** "), ** 标识允许访问:consumer路径下全部,如果在当前Controller中,你只想部分暴露,那么更正为:

  • 删除Controller上的:SoulSpringMvcClient(path = "/consumer/** ")
  • 在对应需要暴露的接口上,加上全路径,如:  @SoulSpringMvcClien(path = "/consumer/getUserById")
package com.youzha.dubbo.Controller;
import com.youzha.dubbo.dto.ResultDTO;
import com.youzha.dubbo.entity.User;
import com.youzha.dubbo.service.RemoteUserService;
import lombok.extern.slf4j.Slf4j;
import org.dromara.soul.client.springmvc.annotation.SoulSpringMvcClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
/**
 * @author youzhaxiaobo
 * @version 1.0
 * @date 2020/7/1 19:30
 * @Desc
 */
@Slf4j
@RestController
@RequestMapping("/consumer")
@SoulSpringMvcClient(path = "/consumer/**")
public class ConsumerController {
    @Autowired
    private RemoteUserService userService;
    @GetMapping(value = "/getUserById", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResultDTO getUserById(@RequestParam("id") int id) {
        log.info("id=" + id);
        User user = userService.findById(id);
        log.info("消费者获取用户,信息为:{}", user);
        if(null == user) {
           return new ResultDTO(-1, "获取失败");
        }
        return new ResultDTO(200, "获取成功", user);
    }
    @GetMapping(value = "/helloWorld", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResultDTO helloWorld() {
        log.info("id=" + 1);
        User user = userService.findById(1);
        log.info("消费者获取用户,信息为:{}", user);
        if(null == user) {
            return new ResultDTO(-1, "获取失败");
        }
        return new ResultDTO(200, "获取成功", user);
    }
}

3.1.3 配置文件

soul:
  # 网关http配置
  http:
    adminUrl: http://127.0.0.1:9093
    contextPath: /consumer
    appName: consumer
    full: false
    port: 9092

说明:

  • http:标注这里协议是Http,同样还有(dubbo等)
  • adminUrl:对应soul-admin启动的应用地址,端口
  • contextPath:对应注册进Soul的路由前缀(即我们后续通过网关访问的限制名,多个应用应不同)
  • appName:对应的应用名称,不配置的话,会默认取 dubbo配置中application 中的名称
  • full:true则表示代理全部,全局允许访问,权限很大;false表示非全局,只访问有注解的地方(推荐)
  • port:当前应用的启动端口,并非soul-admin或网关,需保持一直


另外,如果你在 application.yaml(properties) 中配置了context-path,请删除,这个配置对于Soul而言是无感知的,即你的配置文件中不应出现下面的servlet配置:

server:
  port: 9092
  servlet:
    context-path: **

如果你在这里配置的:full是false,那么对应3.1.2章节就无需调整,如果是true,直接3.1.2关于SoulPringMvcClient相关注解即可。

3.2 消费者接入Soul

消费者相关配置,和提供者是一致的,这里不再赘述,直接贴出相关代码。

3.2.1 pom

<dependency>
  <groupId>org.dromara</groupId>
  <artifactId>soul-spring-boot-starter-client-alibaba-dubbo</artifactId>
  <version>2.2.0</version>
</dependency>
<dependency>
  <groupId>org.dromara</groupId>
  <artifactId>soul-spring-boot-starter-client-springmvc</artifactId>
  <version>2.2.0</version>
</dependency>
<dependency>
  <groupId>org.dromara</groupId>
  <artifactId>soul-client-springmvc</artifactId>
  <version>2.2.0</version>
</dependency>

3.2.2 Controller

package com.youzha.dubbo.controller;
import com.youzha.dubbo.dto.ResultDTO;
import lombok.extern.slf4j.Slf4j;
import org.dromara.soul.client.springmvc.annotation.SoulSpringMvcClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
 * @author youzhaxiaobo
 * @version 1.0
 * @date 2020/7/4 0004 13:52
 * @Desc
 */
@Slf4j
@RestController
@RequestMapping("/provider")
@SoulSpringMvcClient(path = "/provider/**")
public class ProviderController {
    @GetMapping(value = "/hello", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResultDTO getUserById(@RequestParam("id") int id) {
        log.info("id=" + id);
        if (id > 0) {
            return new ResultDTO(-1, "获取失败");
        }
        return new ResultDTO(200, "获取成功");
    }
}

3.2.3 配置文件

soul:
  # 网关dubbo配置
  dubbo:
    adminUrl: http://127.0.0.1:9093
    contextPath: /provider-youzha
    appName: provider-youzha
  # 网关http配置
  http:
    adminUrl: http://127.0.0.1:9093
    contextPath: /provider
    appName: provider
    full: false
    port: 9091

说明:

  • 这里同时暴露出去了dubbo,http两套协议,dubbo对应的就是我们提供在Service层的代码,其变更很小,如下,只是增加了一个注解:@SoulDubboClient

  • dubbo,http提供的contextPath的路由前缀,需要保持不同,同时全局唯一(即不能和其他应用一致)

3.3 验证

前提:启动了zookeeper,启动了MySQL。

3.3.1 启动soul-admin

直接启动相关Application即可,登陆控制台查看:localhost:9093,用户名/密码:admin/123456。

成功之后,查看插件,注意这里确保二者开启,且配置项和我吻合:

其中:divide

zk:

{"register":"zookeeper://127.0.0.1:2181"}

3.3.2 启动soul-boostrap

直接启动相关Application即可。

3.3.3 启动soul-provider

直接启动相关Application即可,出现下面的日志则表示注册成功:

3.3.4 启动soul-consumer

直接启动相关Application即可,出现下面的日志则表示注册成功:

注意:

3.3.3,3.3.4启动完成之后,查看soul-admin的网页管理端,应该出现下图:

3.3.5 验证

此时直接通过自身IP访问消费者,地址:http://localhost:9092/consumer/getUserById?id=1,查看日志:

消费者:

提供者:

通过网关访问消费者,地址:http://localhost:9094/consumer/consumer/getUserById?id=1,查看日志:

消费者:

提供者:

直接通过自身IP访问提供者,地址:http://localhost:9091/provider/hello?id=-1

通过网关访问提供者,地址:http://localhost:9094/provider/provider/hello?id=-1

Chrome POST验证provider的dubbo接口

fetch(new Request('http://localhost:9094/provider/provider-youzha/findById',{
    method:'POST', 
    headers: {'Content-Type': 'application/x-www-form-urlencoded'},
    body:"id=1"
})).then((resp)=>{console.log(resp)})

注意:

  • 通过网关访问,其地址为boostrap对应的:ip+端口
  • 访问地址需要加上路由前缀,即配置文件中 soul 模块中的contextPath
  • 如果你的项目和soul不部署在同一服务器,请在你的配置文件中追加上该配置(以你实际部署机器IP为准),保证Soul能管理你的服务
  • soul.http.host=168.10.54.115


3.4 完整代码

📎Dubbo_Soul.rar

📎zookeeper.rar

📎redis.rar

📎Soul.rar

相关文章
|
3月前
|
Java 数据库连接 调度
xxljob执行源码分析
本文深入解析XXL-JOB分布式任务调度框架源码,涵盖架构设计、核心执行流程与关键线程池机制。内容包括任务触发、注册、失败重试、日志报告及时间轮调度原理,结合带中文注释的源码包与分析导图,全面剖析其高性能设计实现。
 xxljob执行源码分析
|
3月前
|
人工智能 Serverless API
一键部署Stable Diffusion教程
本教程指导用户通过阿里云函数计算一键部署Stable Diffusion,支持多种绘图风格,提供免费额度体验。包含详细步骤与注意事项,助力快速搭建AI绘画环境。
一键部署Stable Diffusion教程
|
3月前
|
存储 算法 BI
xxljob本地运行
本文介绍XXL-JOB分布式任务调度框架的本地部署与使用流程,涵盖源码获取、服务端数据库初始化、配置修改、服务启动及客户端注册执行器等步骤,并演示如何配置调度任务、选择路由策略及测试执行效果,帮助快速上手使用。
 xxljob本地运行
|
3月前
|
消息中间件 算法 网络协议
8.选举机制理解描述
本文深入解析ZooKeeper的Leader选举机制,涵盖启动期与运行期的选举流程、FastLeaderElection算法核心规则及实现细节,重点分析投票PK、逻辑时钟、状态变更等关键环节,揭示数据一致性保障原理。
|
3月前
|
监控 Java 调度
定时任务概述
定时任务是通过时间表达式调度执行的任务,适用于定时对账、超时取消等场景。实现方案包括单体架构中的轮询休眠、Timer、ScheduledExecutorService、Quartz及SpringTask;分布式架构下则面临重复执行、动态调整等问题,主流解决方案有XXL-JOB、Elastic-Job、Saturn和ScheduleX等。
|
3月前
|
缓存 运维 监控
一场FullGC故障排查
本文记录了一次线上CPU使用率飙升至104%的问题排查过程。通过分析发现,问题根源为JVM频繁Full GC,而机器内存监控未明显异常,易造成误判。进一步使用JProfiler分析堆内存快照,定位到大对象(List&lt;Map&gt;)占用近900MB空间,导致老年代被打满。该对象源于将Excel数据以低效结构加载至内存且长时间驻留。解决方案包括“治本”——将数据移出JVM内存存入Redis,或“治标”——请求后及时清理冗余字段。最终总结了从监控识别、工具分析到代码定位的完整排查思路,强调应关注JVM层面指标,并合理设计内存使用结构。
一场FullGC故障排查
|
3月前
|
jenkins Java 持续交付
SpringBoot集成Jenkins
本文介绍在阿里云CentOS系统上安装配置Jenkins的完整流程,涵盖环境准备(JDK1.8)、Jenkins安装与启动、端口及用户配置、Git与Maven集成,并包含插件安装与初始设置步骤,助力实现持续集成部署。
 SpringBoot集成Jenkins
|
3月前
|
缓存 前端开发 安全
5.数据同步原理
Soul网关通过推拉模式实现配置数据同步,支持WebSocket、HTTP长轮询和Zookeeper三种策略。管理后台变更配置后,通过EventPublisher发布事件,依据同步策略将变更推送给网关,实现准实时更新。HTTP长轮询借鉴Apollo、Nacos设计,结合异步Servlet机制,确保高效与低延迟。
 5.数据同步原理
|
3月前
|
Dubbo Java 应用服务中间件
1.入门运行Soul
Soul 是基于 WebFlux 构建的响应式 API 网关,支持 Dubbo、Spring Cloud 等多种协议,具备高性能、异步、跨语言特性。提供插件化架构,支持热插拔、动态配置、A/B 测试与蓝绿发布,集成鉴权、限流、熔断等丰富插件,适用于微服务网关场景。
 1.入门运行Soul
|
3月前
|
缓存 开发工具 git
QLExpress使用及源码分析
基于阿里巴巴QLExpress规则引擎,通过实体构建、接口定义与脚本编写(如user.yaml),实现灵活的业务规则配置。支持AST语法树解析、上下文赋值与缓存机制,适用于动态表达式执行与规则计算场景。

热门文章

最新文章