3.Soul网关接入与验证

简介: 本章基于前两章搭建的应用,引入Soul网关,重点实现Provider与Consumer服务接入Soul。通过添加Soul客户端依赖、使用@SoulSpringMvcClient注解标记接口,并配置soul-http参数,完成服务注册与网关路由。支持局部或全局路径暴露,结合ZooKeeper与MySQL,启动soul-admin与soul-bootstrap验证网关调用。

此章节将基于上一章节基础之上,引入Soul网关,至于Soul网关是干什么的,怎么做的,我们会在后续章节讲解,1-3章节侧重于搭建应用。
本章节的Soul网关接入,如果你1,2章节都是和我保持一致,那么只需要直接启动Soul网关即可,但是对应的provider,consumer应用是需要额外的代码接入的。
开发环境和第二章保持一致。
3.1 提供者接入Soul
3.1.1 pom


org.dromara
soul-spring-boot-starter-client-alibaba-dubbo
2.2.0


org.dromara
soul-spring-boot-starter-client-springmvc
2.2.0


org.dromara
soul-client-springmvc
2.2.0

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


org.dromara
soul-spring-boot-starter-client-alibaba-dubbo
2.2.0


org.dromara
soul-spring-boot-starter-client-springmvc
2.2.0


org.dromara
soul-client-springmvc
2.2.0

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 完整代码

相关文章
|
1月前
|
人工智能 API 开发工具
2025技术实战:在国内如何调用 Google Gemini 3.0 Pro?
Gemini 3.0 Pro 的发布带来了原生的多模态能力,但在国内(CN Region)进行 API 对接时,开发者常面临 Geo-blocking 和支付验证两大难题。本文将从网络层和应用层出发,解析主流的接入方案,并提供一份基于 Python 的标准化调用示例。
1127 4
|
2月前
|
存储 算法 BI
xxljob本地运行
本文介绍XXL-JOB分布式任务调度的部署与使用。包含源码获取、数据库导入、服务端配置启动、客户端注册及执行器配置。详细说明各数据表作用、路由策略类型,并演示任务创建、参数设置与执行日志查看,助你快速上手XXL-JOB。
|
2月前
|
数据可视化 Java 关系型数据库
01-认识Activiti
工作流指如请假、报销等需审批的业务流程,通过可视化引擎实现多节点审批,广泛应用于CRM、WMS等系统。主流技术包括BPMN、Activiti和Flowable,其中Activiti为Java系开源引擎,支持复杂流程自动化,推动企业流程数字化。
|
2月前
|
监控 Java 调度
定时任务概述
定时任务指通过时间表达式调度执行的任务,适用于定时对账、超时取消等场景。实现方案包括单体架构的轮询、Timer、ScheduledExecutorService、Quartz、SpringTask,以及分布式架构下的TBSchedule、Elastic-Job、XXL-JOB等,解决集群重复执行、动态调度、故障转移等问题。
|
2月前
|
运维 Kubernetes Java
物理部署图
物理部署图描述系统运行时的硬件配置与软件部署结构,展现节点、构件、物件及连接关系,帮助理解分布式系统的网络架构与运维部署,常用于指导应用与硬件的协同运行。
|
2月前
|
数据采集 数据建模 领域建模
领域模型图(数据架构/ER图)
数据架构核心输出为ER图,通过四色原型法进行领域建模:红色MI表示时标事件,绿色PPT为业务实体,黄色Role是参与角色,蓝色DESC提供描述属性。以风控系统为例,从业务流程中提炼MI,构建PPT实体,补充角色与描述,最终提取实体关系,形成ER图,指导数据建模。(238字)
|
2月前
|
uml C语言
系统时序图
时序图(Sequence Diagram)是UML中描述对象间消息传递时间顺序的交互图,横轴为对象,纵轴为时间。它用于展示对象协作过程,强调交互的时间顺序,直观表达并发行为。主要元素包括角色、对象、生命线、控制焦点和消息等,广泛应用于系统动态建模。
|
2月前
|
存储 缓存 算法
零拷贝
实现文件传输时,传统方式因频繁系统调用导致大量上下文切换与内存拷贝,性能低下。零拷贝技术通过减少用户态与内核态切换、避免冗余数据拷贝,显著提升效率。结合PageCache预读优势,适用于小文件高速传输;而大文件场景则推荐异步IO加直接IO,绕过PageCache,避免缓存污染,兼顾并发与性能。
|
2月前
|
API 数据库 uml
如何写好一篇技术方案
本项目旨在升级知识库基础能力,优化目录与文档管理体验,提升拖拽交互流畅度。通过整合功能模块、流程图、UML及时序图等设计,完善系统架构与API接口,推动研发高效协同,提升用户使用体验。
|
2月前
|
SQL 运维 分布式计算
如何做好SQL质量监控
SLS推出用户级SQL质量监控功能,集成于CloudLens for SLS,提供健康分、服务指标、运行明细、SQL Pattern分析及优化建议五大维度,帮助用户全面掌握SQL使用情况,定位性能瓶颈,优化查询效率,提升日志分析治理能力。