提供會員註冊服務,使用者必須註冊成會員才能享受應用提供的服務,如瀏覽和釋出新聞, 但有些服務又需要指定角色的會員才能操作,如所有會員都可以瀏覽新聞,只有管理員(admin)角色的會員才可以釋出新聞。
有 2 個公開的 api:
- CheckName:判斷使用者名稱是否可用;
- Register:根據使用者名稱註冊會員;
1 宣告介面,建立基於 .Net Core 6.0 的類庫專案,命名為 Register.IServices
1.1 新增 jimu 引用
Install-Package Jimu
1.2 建立 dto 類
using System; using System.Collections.Generic; using System.Text; namespace Register.IServices { public class Member { public Guid Id { get; set; } public string Name { get; set; } public string NickName { get; set; } public string Pwd { get; set; } } }
1.3 宣告公開的微服務介面
微服務的定義規則:
- 必須繼承 IJimuService 介面
- 宣告路由屬性 [JimuServiceRoute()]
- 方法新增屬性 [JimuService()],該方法才會註冊成公開的微服務
Jimu 支援非同步方法, 如下面的 Register
下面的兩個方法,未設定 EnableAuthorization = true(預設為 false),都可以匿名訪問
using System; using System.Threading.Tasks; using Jimu; namespace Register.IServices { [JimuServiceRoute("/api/v1/register")] public interface IRegisterService : IJimuService { [JimuService(CreatedBy = "grissom", CreatedDate = "2018-07-17", Comment = "check member name whether is valid")] bool CheckName(string name); [JimuService(CreatedBy = "grissom", CreatedDate = "2018-07-17", Comment = "register member")] Task<bool> Register(string name, string nickname, string pwd); } }
2 實現介面,建立基於 .Net Core 6.0 的類庫專案,命名為 Register.Services
2.1 新增對介面專案 Register.IServices 的引用
2.2 實現介面
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Register.IServices; namespace Register.Services { public class RegisterService : IRegisterService { static List<Member> _membersDb = new List<Member>(); public bool CheckName(string name) { return !_membersDb.Any(x => x.Name == name); } public Task<bool> Register(string name, string nickname, string pwd) { if (!CheckName(name)) { return Task.FromResult(false); } _membersDb.Add(new Member { Id = Guid.NewGuid(), Name = name, NickName = nickname, Pwd = pwd }); return Task.FromResult(true); } } }
3 微服務的宿主伺服器,建立基於 .Net Core 6.0 的控制檯應用, 命名為 Register.Server
3.1 新增對專案: Register.Services 的引用
3.2 新增 jimu.server 和 Jimu.Common.Discovery.ConsulIntegration 引用
Install-Package Jimu.Server
Install-Package Jimu.Common.Discovery.ConsulIntegration
3.3 啟動 jimu 服務程式碼
using Jimu.Server; using System; namespace Register.Server { class Program { static void Main(string[] args) { var builder = new ServiceHostServerBuilder(new Autofac.ContainerBuilder()) .UseLog4netLogger() // 使用 log4net 記錄日誌 .LoadServices("Register.IServices", "Register.Services") // 載入服務 .UseDotNettyForTransfer("127.0.0.1", 8001) // DotNetty 監聽 8001 埠進行通訊 .UseConsulForDiscovery("127.0.0.1", 8500, "JimuService", $"127.0.0.1:8001") // 使用 consul, "JimiService" 指定註冊服務時,key 帶上的字首,相當於服務分組,$"127.0.0.1:8001" 指定服務宿主的訪問地址 .UseJoseJwtForOAuth<Jimu.DotNettyAddress>(new Jimu.Server.OAuth.JwtAuthorizationOptions { SecretKey = "123456", }); // 使用 jwt 進行鑑權,這裡只是驗證 token,所以只需驗證的金鑰, 生產 token 在 Auth.Server 服務 using (var host = builder.Build()) { host.Run(); // 啟動服務 while (true) { Console.ReadKey(); } } } } }