dotnet core微服務框架Jimu ~ 會員註冊微服務

Flamesky發表於2024-11-07

提供會員註冊服務,使用者必須註冊成會員才能享受應用提供的服務,如瀏覽和釋出新聞, 但有些服務又需要指定角色的會員才能操作,如所有會員都可以瀏覽新聞,只有管理員(admin)角色的會員才可以釋出新聞。

有 2 個公開的 api:

  1. CheckName:判斷使用者名稱是否可用;
  2. 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 宣告公開的微服務介面

微服務的定義規則:

  1. 必須繼承 IJimuService 介面
  2. 宣告路由屬性 [JimuServiceRoute()]
  3. 方法新增屬性 [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();
                }
            }
        }
    }
}

相關文章