原文:Surging 微服务框架使用入门

前言

本文非 Surging 官方教程,只是自己学习的总结。如有哪里不对,还望指正。 

我对 surging 的看法

我目前所在的公司采用架构就是类似与Surging的RPC框架,在.NET 4.0框架上搭建Socket RPC,通过分组轮询的方式调度RPC,经历过3次双十一的考验,实际最高时有800多人同时作业,同时并发达到600人/连接rpc ,24小时不间断作业,这是实际数据,理论上更高,只需要加RPC就可以了,剩下的就看数据库以及缓存的性能了,说到数据库,这又是另外一个技术栈了。虽然这个数据并不能说明RPC有多高效,但确是实实在在的现场数据。

surging的出现给了我眼前一亮的感觉,内部RPC,外部网关。原来这就是微服务框架,数据监控、流量控制、分流控制、重试、熔断........。居然还能这样做,尽管部分术语你可能很早很早就听过了,但却没有形成一个框架,或者使用起来很困难。surging 恰恰就是这样一个集大成者的框架,所有这些surging帮你做了,而且非常非常高效。这个高效不仅仅体现在surging的性能上(surging性能作者有过测试),还体现在开发上,只要稍有基础就能轻易驾驭,剩下就是整合业务进行开发了。

一、准备

服务注册中心的选择:目前 Surging 提供了 Zookeeper、Consul 作为服务注册中心,后期还可能会把 service-fabric 加入进来,中文官方地址:https://docs.microsoft.com/zh-cn/azure/service-fabric/

Event Bus 的选择:Surging 同样提供了多种选择,有 RabbitMQ,Kafka 等选择。

具体使用哪种,就看自己的技术栈啦

 二、示例开发

1.在sqlserver中建立Test 数据库

运行下面脚本,生成user表

test.db

2.运行Surging Demo

clone代码 git clone https://github.com/billyang/SurgingDemo.git

因为本示例项目没有从nuget 引用,直接从 surging 项目引用,没有拷贝一份放在自己的解决方案,

假设目录结构如下:

D:\git\surging
D:\git\SurgingDemo

最终保持Surging和SurgingDemo在同一个目录

这样做的好处:

  • 是和 surging 保持最新代码

  • 是方便学习surging和调试,毕竟你想使用surging、理解surging才是踏出第一步

 

ApiGateway 使用 surging 的例子,当然正式开发建议自己重写 ApiGateway

服务管理使用 consul,因为调试简单,只需 consul agent -dev 即可开启consul

在 windows 中启动:
发布网关 1. ApiGateway                dotnet run Surging.ApiGateway
启用服务 2. Server              dotnet Bill.Demo.Services.Server.dll
发布客户端(本示例使用 web mvc) 3. Bill.Demo.Web               dotnet run Bill.Demo.Web

假设你已经把SurgingDemo已运行起来了,即可对根据Dapper对User进行增删改查 

 

三、介绍一下本示例各项目的职责

Bill.Demo.Core 用户定义数据模型

Bill.Demo.DapperCore (Dapper仓储,其中仓储需继承 UserRepository: Surging.Core.CPlatform.Ioc.BaseRepository)

public class UserRepository: BaseRepository, IBaseRepository<User>

    {

        /// <summary>

        /// 创建一个用户

        /// </summary>

        /// <param name="entity">用户</param>

        /// <param name="connectionString">链接字符串</param>

        /// <returns></returns>

        public Task<Boolean> CreateEntity(User entity, String connectionString = null)

        {

            using (IDbConnection conn = DataBaseConfig.GetSqlConnection(connectionString))

            {

                string insertSql = @"INSERT  INTO dbo.auth_User

                                    ( TenantId ,

                                      Name ,

                                      Password ,

                                      SecurityStamp ,

                                      FullName ,

                                      Surname ,

                                      PhoneNumber ,

                                      IsPhoneNumberConfirmed ,

                                      EmailAddress ,

                                      IsEmailConfirmed ,

                                      EmailConfirmationCode ,

                                      IsActive ,

                                      PasswordResetCode ,

                                      LastLoginTime ,

                                      IsLockoutEnabled ,

                                      AccessFailedCount ,

                                      LockoutEndDateUtc

                                    )

                            VALUES  ( @tenantid ,

                                      @name ,

                                      @password ,

                                      @securitystamp ,

                                      @fullname ,

                                      @surname ,

                                      @phonenumber ,

                                      @isphonenumberconfirmed ,

                                      @emailaddress ,

                                      @isemailconfirmed ,

                                      @emailconfirmationcode ,

                                      @isactive ,

                                      @passwordresetcode ,

                                      @lastlogintime ,

                                      @islockoutenabled ,

                                      @accessfailedcount ,

                                      @lockoutenddateutc

                                    );";

                return Task.FromResult<Boolean>(conn.Execute(insertSql, entity) > 0);

            }

        }

   }

Bill.Demo.IModuleServices (和Surging项目一样,定义模块服务接口以及领域模型)

        Task<UserDto> GetUserById(Int64 id);
       
       Task<Boolean> UpdateUser(UserDto user);        Task<Boolean> DeleteUser(Int64 userId);

Bill.Demo.ModuleServices (和Surging项目一样,实现模块服务)

如:

public async Task<UserDto> GetUserById(Int64 id)

        {

            var user = await _repository.GetEntityById(id);

            return new UserDto()

            {

                Id = user.Id,

                EmailAddress = user.EmailAddress,

                Name = user.Name,

                PhoneNumber = user.PhoneNumber,

                Surname = user.Surname,

                TenantId = user.TenantId,

                FullName = user.FullName,

            };

        }

        public async Task<Boolean> UpdateUser(UserDto user)

        {

            var entity = await _repository.GetEntityById(user.Id);

            entity.Name = user.Name;

            entity.Password = user.Password;

            entity.FullName = user.FullName;

            entity.Surname = user.Surname;

            entity.EmailAddress = user.EmailAddress;

            entity.PhoneNumber = user.PhoneNumber;

            return await _repository.Update(entity);

        }

        public async Task<Boolean> DeleteUser(Int64 userId)

        {

            return await _repository.Delete(userId);

        }

Bill.Demo.Services.Server 服务

Bill.Demo.Web 客户端

        public async Task<IActionResult> Delete(Int64 id)

        {

            var service = ServiceLocator.GetService<IServiceProxyFactory>();

            var userProxy = service.CreateProxy<IUserService>("User");

            await userProxy.DeleteUser(id);

            return RedirectToAction("User");

        }

        public async Task<JsonResult> GetUser(Int64 id)

        {

            var service = ServiceLocator.GetService<IServiceProxyFactory>();

            var userProxy = service.CreateProxy<IUserService>("User");

            var output= await userProxy.GetUserById(id);

            return new JsonResult(output);

        }

        public async Task<JsonResult> Update(UserDto dto)

        {

            var service = ServiceLocator.GetService<IServiceProxyFactory>();

            var userProxy = service.CreateProxy<IUserService>("User");

            var output = await userProxy.UpdateUser(dto);

            return new JsonResult(output);

        }

原文地址: https://www.cnblogs.com/billyang/p/8376076.html



.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

Surging 微服务框架使用入门的更多相关文章

  1. 【非官方】Surging 微服务框架使用入门

    前言 本文非 Surging 官方教程,只是自己学习的总结.如有哪里不对,还望指正. 我对 surging 的看法 我目前所在的公司采用架构就是类似与Surging的RPC框架,在.NET 4.0框架 ...

  2. (三)surging 微服务框架使用系列之我的第一个服务(审计日志)

    前言:前面准备了那么久的准备工作,现在终于可以开始构建我们自己的服务了.这篇博客就让我们一起构建自己的第一个服务---审计日志. 首先我们先创建两个项目,一个控制台的服务启动项目,一个业务的实现项目. ...

  3. 一)surging 微服务框架使用系列之surging 的准备工作rabbitmq安装(转载 https://www.cnblogs.com/alangur/p/8339905.html)

    (一)surging 微服务框架使用系列之surging 的准备工作rabbitmq安装   (1)下载erlang: http://www.erlang.org/download/otp_win64 ...

  4. 转载 (三)surging 微服务框架使用系列之我的第一个服务(审计日志)

    (三)surging 微服务框架使用系列之我的第一个服务(审计日志)   前言:前面准备了那么久的准备工作,现在终于可以开始构建我们自己的服务了.这篇博客就让我们一起构建自己的第一个服务---审计日志 ...

  5. golang微服务框架go-micro 入门笔记2.4 go-micro service解读

    本章节阐述go-micro 服务发现原理 go-micro架构 下图来自go-micro官方 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go- ...

  6. golang微服务框架go-micro 入门笔记2.3 micro工具之消息接收和发布

    本章节阐述micro消息订阅和发布相关内容 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架go-mi ...

  7. golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web

    micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go- ...

  8. golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

    micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.s ...

  9. golang微服务框架go-micro 入门笔记1.搭建 go-micro环境

    微服务的本质是让专业的人做专业的事情,做出更好的东西. golang具备高并发,静态编译等特性,在性能.安全等方面具备非常大的优势.go-micro是基于golang的微服务编程框架,go-micro ...

随机推荐

  1. OpenCASCADE 3 Planes Intersection

    OpenCASCADE 3 Planes Intersection eryar@163.com Abstract. OpenCASCADE provides the algorithm to sear ...

  2. js---10时间类

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  3. html5页面怎么播放音频和视频

    html5页面怎么播放音频和视频 一.总结 一句话总结:html5 音频和视频标签:(audio And video),局限是不同浏览器对音频视频的格式支持很让人头痛 1.最基础的音频和视频标签的使用 ...

  4. Vue中独立组件之间数据交互

    独立组件之间数据交互:通过自定义事件 组件A中的[数据],传递给组件B 1.创建组件A,组件B 2.组件B在实例创建完成时就开始监听事件[等待接收数据]:钩子 3.组件A中触发事件,发送数据 注意:接 ...

  5. ES6第三节:变量的解构赋值

    ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构.下面我们看实际的例子: 一.数组解构: let [a,b,c] = [1,2,3]; console.log(a); //a ...

  6. VS Code 终端显示问题

    一.打开编辑器的终端时候,然后弹出了系统自带的cmd窗口 解决办法: Win+R 输入cmd 打开windows cmd窗口,窗口顶部右键属性,然后取消勾选使用旧版控制台,然后重启编辑器就行了. 二. ...

  7. CMDB学习之四 ——DEBUG模式

    定义一个debug,进行解析调试,到测试文件 配置文件,配置debug模式,定义环境变量, #!/usr/bin/env python # -*- coding:utf-8 -*- import os ...

  8. codeforces 688D

    题意: 给你n和k,表示有n个数,c1到cn,然后让你求一个数x,可以告诉你x%ci的值,问你是否可以唯一确定一个x%k的值 题解: 反证: 假设有两个x1,x2同时是解,则对于所有ci,x1%ci= ...

  9. java bigdecimal (java double也时会失真)

    BigDecimal加减乘除运算 2011-11-21 21:22 6470人阅读 评论(0) 收藏 举报 stringdivjavaup工具 java.math.BigDecimal.BigDeci ...

  10. 基于 Cookie 的 SSO 中间件 kisso

    kisso  =  cookie sso 基于 Cookie 的 SSO 中间件,它是一把快速开发 java Web 登录系统(SSO)的瑞士军刀.欢迎大家使用 kisso !! kisso 帮助文档 ...