53-微服务技术栈(高级):微服务网关Soul(Soul网关接入与验证)

本文涉及的产品
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 此章节将基于上一章节基础之上,引入Soul网关,至于Soul网关是干什么的,怎么做的,我们会在后续章节讲解,1-3章节侧重于搭建应用。本章节的Soul网关接入,如果你1,2章节都是和我保持一致,那么只需要直接启动Soul网关即可,但是对应的provider,consumer应用是需要额外的代码接入的。开发环境和第二章保持一致。

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

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

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

1 提供者接入Soul

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>

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);

   }


}

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相关注解即可。

2 消费者接入Soul

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

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>

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, "获取成功");

   }

}

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 验证

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

3.1 启动soul-admin

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

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

其中:divide

zk:

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

3.2 启动soul-boostrap

直接启动相关Application即可。

3.3 启动soul-provider

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

3.4 启动soul-consumer

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

注意:

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

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

4 完整代码

📎Dubbo_Soul.rar

📎zookeeper.rar

📎redis.rar

📎Soul.rar

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
7天前
|
微服务 应用服务中间件
微服务跨域(通过网关配置进行跨域)
在单体架构中,我们通常通过SpringMVC配置类实现CORS跨域支持,设置允许的来源、请求头、方法及凭证等。然而,在微服务架构下,因浏览器首先访问网关再进行服务路由,需在网关配置跨域。对于无SpringMVC环境的网关(如使用Gateway组件),我们可在YAML文件中配置`spring.cloud.gateway.globalcors`属性,以实现全局跨域支持。
26 0
|
3天前
|
运维 Cloud Native 应用服务中间件
阿里云微服务引擎 MSE 及 API 网关 2024 年 07 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要。
|
6天前
|
API
阿里云微服务引擎及 API 网关 2024 年 7 月产品动态
阿里云微服务引擎及 API 网关 2024 年 7 月产品动态。
|
9天前
|
设计模式 监控 API
探索微服务架构中的API网关模式
在微服务的宇宙里,API网关是连接星辰的桥梁。它不仅管理着服务间的通信流量,还肩负着保护、增强和监控微服务集群的重任。本文将带你走进API网关的世界,了解其如何成为微服务架构中不可或缺的一环,以及它在实际应用中扮演的角色和面临的挑战。
|
12天前
|
安全 前端开发 Java
微服务网关及其配置
微服务网关及其配置
50 4
|
12天前
|
缓存 监控 API
【微服务战场上的神秘守门人】:揭秘API网关的超能力 —— 探索微服务架构中的终极守护者与它的神奇魔法!
【8月更文挑战第7天】随着微服务架构的流行,企业应用被拆分为围绕特定业务功能构建的小型服务。API网关作为微服务间的通信管理核心,对请求进行路由、认证、限流等处理,简化客户端集成并提升用户体验。以电商应用为例,通过Kong部署API网关,配置产品目录等服务的API及JWT认证插件,确保安全高效的数据交互。这种方式不仅增强了系统的可维护性和扩展性,还提供了额外的安全保障。
29 2
|
15天前
|
负载均衡 监控 API
探索微服务架构中的API网关模式
在微服务架构的海洋中,API网关扮演着枢纽的角色。它不仅是客户端请求的接收者,也是各个微服务间通信的协调者。本文将深入探讨API网关的设计原则、实现策略以及它在微服务生态中的重要性。我们将通过实际案例分析,了解API网关如何优化系统性能、提高安全性和简化客户端与服务的交互。
31 4
|
15天前
|
运维 监控 负载均衡
探索微服务架构中的API网关设计
在微服务架构的复杂性中,API网关作为客户端和后端服务间的桥梁,扮演着至关重要的角色。本文将深入探讨如何设计一个高效、可扩展且安全的API网关,包括处理请求转发、负载均衡、身份验证、监控与日志记录等核心功能,并讨论如何在保障性能的同时确保系统的高可用性和安全性。通过具体案例,我们将了解API网关在实际生产环境中的实现方式及其对整个微服务生态系统的影响。
38 3
|
12天前
|
监控 供应链 安全
构建高效微服务架构:API网关与服务熔断策略
【7月更文挑战第38天】随着现代应用程序向微服务架构的转型,系统的稳定性和效率成为了开发团队关注的焦点。本文将探讨在微服务环境中实现系统可靠性的关键组件——API网关,以及如何在服务间通讯时采用熔断机制来防止故障蔓延。通过分析API网关的核心功能和设计原则,并结合熔断策略的最佳实践,我们旨在提供一套提高分布式系统弹性的策略。
|
17天前
|
存储 负载均衡 安全
探索微服务架构下的API网关设计
在微服务架构中,API网关不仅是客户端与后端服务的桥梁,更承担着请求路由、负载均衡、认证授权等关键角色。本文将深入探讨如何设计一个高效、安全的API网关,确保系统的稳定性和可扩展性,同时提升用户体验。