surging-框架学习,简单搭建开发Demo(一)
时间:2019-08-19
本文章向大家介绍surging-框架学习,简单搭建开发Demo(一),主要包括surging-框架学习,简单搭建开发Demo(一)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
surging源码地址 https://github.com/dotnetcore/surging
一、surging 网关启动
下载surging源码后,可以直接启动surging网关项目,也可以发布后使用。需要注意的是,需要启动consul、redis
gatewaySettings.json 网关配置文件
二、服务项目搭建
项目目录
using ProtoBuf; using System; using System.Collections.Generic; using System.Text; namespace ZC.Sys.Entitys.Request { /// <summary> /// 登录请求对象 /// </summary> [ProtoContract] public class AuthenticationRequestData { /// <summary> /// 用户名 /// </summary> [ProtoMember(1)] public string UserName { get; set; } /// <summary> /// 密码 /// </summary> [ProtoMember(2)] public string Pwd { get; set; } } }
业务接口层
using Surging.Core.CPlatform.Filters.Implementation; using Surging.Core.CPlatform.Ioc; using Surging.Core.CPlatform.Runtime.Server.Implementation.ServiceDiscovery.Attributes; using System; using System.Threading.Tasks; using ZC.Sys.Entitys.Request; using ZC.Sys.Entitys.VM; namespace ZC.Sys.IService { /// <summary> /// 用户业务接口 /// </summary> [ServiceBundle("api/{Service}")] public interface IUserService:IServiceKey { /// <summary> /// 用戶授权 /// </summary> /// <param name="requestData">请求参数</param> /// <returns>用户模型</returns> Task<VMUserInfo> Authentication(AuthenticationRequestData requestData); /// <summary> /// /// </summary> /// <returns></returns> [Authorization(AuthType = AuthorizationType.JWT)] Task<string> GetName(); /// <summary> /// /// </summary> /// <returns></returns> Task<int> GetAge(); } }
[Authorization(AuthType = AuthorizationType.JWT)]
标记了方法需要进行Token验证,不通过网关调用,不会进行Token验证,也就是说直接请求服务地址不验证Token
业务层代码
using Surging.Core.CPlatform.Ioc; using Surging.Core.CPlatform.Transport.Implementation; using Surging.Core.ProxyGenerator; using System; using System.Threading.Tasks; using ZC.Sys.Entitys; using ZC.Sys.Entitys.Request; using ZC.Sys.Entitys.VM; using ZC.Sys.IService; namespace ZC.Sys.Service { /// <summary> /// 用户相关业务 /// </summary> [ModuleName("User")] public class UserService : ProxyServiceBase, IUserService { public async Task<VMUserInfo> Authentication(AuthenticationRequestData requestData) { VMUserInfo info = new VMUserInfo(); info.UserId = "1"; info.UserName = requestData.UserName; info.RealName = "测试"; return await Task.FromResult(info); } public async Task<int> GetAge() { return await Task.FromResult(33); } public async Task<string> GetName() { var obj = RpcContext.GetContext().GetAttachment("payload"); return await Task.FromResult("测试"); } } }
ModuleName指定接口ServiceKey
RpcContext.GetContext().GetAttachment("payload")
获取的数据为Token用的基本数据,获取Token数据也可以继承RequestData
using ProtoBuf; using Surging.Core.CPlatform; using System; using System.Collections.Generic; using System.Text; namespace ZC.Sys.Entitys.Request { [ProtoContract] public class IdentityUser : RequestData { [ProtoMember(1)] public string RoleId { get; set; } } }
IdentityUser作为接口参数使用
ZC.Sys.RunService 服务启动
以上参考源码项目即可
服务启动后可以在consul中找到注册的服务
使用Swagger 开发者写的文章中有提到如何配置
业务层接口
通过网关地址调用授权
729端口号为网关地址端口
http://127.0.0.1:729/api/oauth2/token 授权地址指向 api/user/authentication (user业务层)
携带token请求网关地址 Token前不要添加Bearer
不通过网关请求接口
NuGet引用的都为surging的1.0版本
仅为个人学习留存
参考地址:
https://github.com/dotnetcore/surging surging开源地址
https://www.cnblogs.com/fanliang11/ surging作者博客
https://github.com/billyang/SurgingDemo
本文demo https://github.com/zx972243884/surgingsmaple
原文地址:https://www.cnblogs.com/zxcnn/p/11378413.html
- 利用sys schema解决一次诡异的语句hang问题
- hdu----(4513)吉哥系列故事——完美队形II(manacher(最长回文串算法))
- 学习manacher(最长公共回文串算法)
- Apache Spark 2.3 加入支持Native Kubernetes及新特性文档下载
- Oracle 12c 多租户专题|隔离PDB的磁盘IO
- golang 裸写一个pool池控制协程的大小
- 2014---多校训练2(ZCC Loves Codefires)
- 完整的golang 多协程+信道 任务处理示例
- 2014---多校训练一(A Couple doubi)
- hdu----(2586)How far away ?(DFS/LCA/RMQ)
- Golang控制goroutine的启动与关闭
- spring-boot-starter-swagger迎新伙伴支持,加速更新进度(1.3.0.RELEASE)
- poj----(1470)Closest Common Ancestors(LCA)
- 测试一下golang协程资源占有率
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 01 . 消息队列之(Kafka+ZooKeeper)
- 01 . 分布式存储之FastDFS简介及部署
- LoRa节点开发——加入打印调试LoRaWAN
- 03 . Redis集群
- 02 . Redis哨兵
- 01 . RabbitMQ简介及部署
- 01 . Memcached原理,主从复制,代理,管理后台
- JsonPath验证类既Groovy重载操作符实践
- Selenium等待:sleep、隐式、显式和Fluent
- 敏捷中的端到端测试
- java编程思想第四版第十章习题
- java编程思想第四版第十一章总结
- java编程思想第四版第十一章习题
- java编程思想第四版第十三章字符串 习题
- java编程思想第四版第十三章字符串 总结