3.Soul网关接入与验证

2024-02-09 15:59
文章标签 验证 网关 接入 soul

本文主要是介绍3.Soul网关接入与验证,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

此章节将基于上一章节基础之上,引入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 {@Autowiredprivate 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:9093contextPath: /consumerappName: consumerfull: falseport: 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: 9092servlet: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:9093contextPath: /provider-youzhaappName: provider-youzha# 网关http配置http:adminUrl: http://127.0.0.1:9093contextPath: /providerappName: providerfull: falseport: 9091

说明:

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

JAVA.png

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

3.3 验证

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

3.3.1 启动soul-admin

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

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

image.png

其中:divide

image.png

zk:

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

image.png

3.3.2 启动soul-boostrap

直接启动相关Application即可。

3.3.3 启动soul-provider

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

image.png

3.3.4 启动soul-consumer

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

image.png

 

注意:

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

image.png

image.png

3.3.5 验证

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

消费者:

image.png

提供者:

image.png

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

消费者:

image.png

提供者:

image.png

 

直接通过自身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

 

3.4 完整代码

📎Dubbo_Soul.rar

📎zookeeper.rar

📎redis.rar

📎Soul.rar

这篇关于3.Soul网关接入与验证的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/694671

相关文章

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

easyui同时验证账户格式和ajax是否存在

accountName: {validator: function (value, param) {if (!/^[a-zA-Z][a-zA-Z0-9_]{3,15}$/i.test(value)) {$.fn.validatebox.defaults.rules.accountName.message = '账户名称不合法(字母开头,允许4-16字节,允许字母数字下划线)';return fal

easyui 验证下拉菜单select

validatebox.js中添加以下方法: selectRequired: {validator: function (value) {if (value == "" || value.indexOf('请选择') >= 0 || value.indexOf('全部') >= 0) {return false;}else {return true;}},message: '该下拉框为必选项'}

web群集--nginx配置文件location匹配符的优先级顺序详解及验证

文章目录 前言优先级顺序优先级顺序(详解)1. 精确匹配(Exact Match)2. 正则表达式匹配(Regex Match)3. 前缀匹配(Prefix Match) 匹配规则的综合应用验证优先级 前言 location的作用 在 NGINX 中,location 指令用于定义如何处理特定的请求 URI。由于网站往往需要不同的处理方式来适应各种请求,NGINX 提供了多种匹

计算机网络基础概念 交换机、路由器、网关、TBOX

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、VLAN是什么?二 、交换机三、路由器四、网关五、TBOXTelematics BOX,简称车载T-BOX,车联网系统包含四部分,主机、车载T-BOX、手机APP及后台系统。主机主要用于车内的影音娱乐,以及车辆信息显示;车载T-BOX主要用于和后台系统/手机APP通信,实现手机APP的车辆信息显示与控

React 笔记 父子组件传值 | 父组件调用子组件数据 | defaultProps | propsType合法性验证

1.通过props实现父组件像子组件传值 、方法、甚至整个父组件 传递整个父组件则   [变量名]={this} import Header from "./Header"render(){return(<Header msg={"我是props传递的数据"}/>)} import React,{Component} from "react";class Header extends

Java后端微服务架构下的服务网关设计:Spring Cloud Zuul

Java后端微服务架构下的服务网关设计:Spring Cloud Zuul 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿! 在微服务架构中,服务网关是微服务系统与外部世界的入口点,它负责请求路由、负载均衡、认证、监控等任务。Spring Cloud Zuul是一个基于Spring Boot的网关服务,它为微服务架构提供了一种灵活、高效的网关解决方案。 服务