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月前
|
运维 安全 JavaScript
证书信息查看 在线工具分享
这是一款基于Vue 3开发的轻量级在线工具——「证书信息查看」,无需安装、零门槛使用。支持输入域名、粘贴PEM证书或上传文件,秒级解析SSL/TLS证书关键信息(签发者、有效期、域名等),兼顾普通用户、站长与安全爱好者需求,全程本地处理,隐私无忧。
466 11
证书信息查看 在线工具分享
|
安全 数据安全/隐私保护
openssh和openssl的版本关系
【4月更文挑战第14天】openssh和openssl的版本关系
3091 0
|
2月前
|
人工智能 API 开发工具
2025技术实战:在国内如何调用 Google Gemini 3.0 Pro?
Gemini 3.0 Pro 的发布带来了原生的多模态能力,但在国内(CN Region)进行 API 对接时,开发者常面临 Geo-blocking 和支付验证两大难题。本文将从网络层和应用层出发,解析主流的接入方案,并提供一份基于 Python 的标准化调用示例。
1819 4
|
3月前
|
存储 JSON NoSQL
MongoDB常用命令
本教程介绍MongoDB数据库操作,涵盖数据库与集合的创建、删除,文档的增删改查及分页排序查询。以文章评论系统为例,演示数据存储结构设计、CRUD操作、条件查询、投影与排序,以及分页实现方法,帮助快速掌握MongoDB基本用法。(238字)
|
3月前
|
数据可视化 Java 关系型数据库
01-认识Activiti
工作流指如请假、报销等需审批的业务流程,通过可视化引擎实现多节点审批,广泛应用于CRM、WMS等系统。主流技术包括BPMN、Activiti和Flowable,其中Activiti为Java系开源引擎,支持复杂流程自动化,推动企业流程数字化。
|
3月前
|
存储 算法 BI
xxljob本地运行
本文介绍XXL-JOB分布式任务调度的部署与使用。包含源码获取、数据库导入、服务端配置启动、客户端注册及执行器配置。详细说明各数据表作用、路由策略类型,并演示任务创建、参数设置与执行日志查看,助你快速上手XXL-JOB。
|
3月前
|
Java 开发工具 数据安全/隐私保护
项目《中州养老》
《中州养老》是一个面向养老院的后台管理系统,涵盖员工管理端与家属小程序端。系统功能包括预约参观、入住退住、计费管理、健康监测等模块。项目采用Vue3+TS+TDesign构建前端,后端基于SpringBoot(SSM),集成Redis缓存、Nginx部署、阿里云OSS与IoT平台。支持RBAC权限控制、智能设备数据实时监控、微信登录、定时任务处理及多线程高效通信,实现养老业务全流程数字化管理。(238字)
|
3月前
|
XML Java 数据库连接
映射关系(1-1 1-n n-n)
本内容介绍MyBatis中四种关联映射:一对一(属性与字段映射,可用resultMap解决命名不一致)、一对多(如用户对应多个角色,使用`<collection>`)、多对一(如作者与博客,使用`<association>`)和多对多(如用户与部门,借助中间类并通过`<collection>`实现双向关联)。
|
3月前
|
NoSQL Redis Docker
第十章 常用组件
本简介涵盖Nginx代理机制、负载均衡与限流,分布式事务中的CAP/BASE理论及Seata模式,分布式锁实现方案,Redis数据类型、持久化与集群策略,MQ异步解耦与消息可靠传输,Elasticsearch倒排索引与搜索优化,Docker容器化与网络模式,Git分支管理与冲突解决,以及Maven项目构建与生命周期等内容,全面解析主流中间件与开发工具的核心原理与实践应用。(239字)
|
3月前
|
存储 NoSQL 关系型数据库
MongoDB索引知识
MongoDB索引通过B树结构提升查询效率,避免全表扫描。支持单字段、复合、地理空间、文本及哈希索引,适用于等值、范围、排序及全文搜索,显著提升大数据量下的查询性能。

热门文章

最新文章