博客
关于我
庐山真面目之七微服务架构Consul集群、Ocelot网关集群和IdentityServer4版本实现
阅读量:417 次
发布时间:2019-03-06

本文共 3885 字,大约阅读时间需要 12 分钟。

庐山真面目之七微服务架构:Consul集群、Ocelot网关集群和IdentityServer4版本实现

在上一篇文章中,我们已经探讨了基于Consul服务集群和Ocelot网关集群的微服务架构。虽然看似完美,但实际上只是解决了那篇文章的特定问题。每篇文章都聚焦于一个核心问题,这样可以帮助读者更清晰地理解每个技术点。今天,我们将重点解决认证和授权问题,确保服务实例不再裸奔在互联网上。


目标

我们的目标是构建一个基于Consul集群、Ocelot网关集群和IdentityServer4的微服务架构。通过这种架构,我们可以为服务实例添加安全防护,防止未经授权的访问。实际项目中,大多数服务并非对外开放,而是需要特定权限才能访问。我们将从以下几个方面入手:

  • 搭建微服务测试项目。
  • 配置Consul集群和Ocelot网关。
  • 集成IdentityServer4进行认证和授权。

  • 搭建微服务测试项目

    首先,我们需要一个测试项目来展示各个技术的实现。这个项目的代码简单明了,主要为了突出Consul、Ocelot和IdentityServer4的功能。

    项目结构

    • PatrickLiu.MicroService.Client:模拟客户端程序,通过地址访问微服务。
    • PatrickLiu.MicroService.Interfaces:定义服务接口。
    • PatrickLiu.MicroService.Models:定义数据模型。
    • PatrickLiu.MicroService.Services:实现服务接口。
    • PatrickLiu.MicroService.ServiceInstance:暴露API的微服务。
    • PatrickLiu.MicroService.Gateway:Ocelot网关。
    • PatrickLiu.MicroService.AuthenticationCenter:IdentityServer4认证中心。

    Consul集群部署

    在生产环境中,单独运行Consul节点无法满足高可用性需求。因此,我们需要部署Consul集群。Consul使用Raft协议进行数据一致性,确保服务发现的高可用性。

    Consul集群配置

  • 下载Consul:从官方网站下载Consul.exe。

  • 部署Consul节点

    • Server-Leader:负责数据同步和健康监测。
    • Server-Follower:负责数据复制和故障恢复。
    • Client:负责转发请求到Server。
  • 验证集群状态

    • 使用consul members命令查看节点状态。
    • 使用consul operator raft list-peers检查Raft网络。

  • Ocelot网关配置

    Ocelot是一个功能强大的.NET Core网关,可以通过JSON配置实现路由、负载均衡、认证和限流等功能。

    配置步骤

  • 安装Ocelot:使用NuGet安装Ocelot和相关插件(如Ocelot.Provider.Consul)。
  • 修改Startup.cs
    services.AddOcelot()    .AddConsul()    .AddCacheManager(builder => builder.WithDictionaryHandle())    .AddPolly();
  • 配置JSON文件
    {    "Routes": [        {            "DownstreamPathTemplate": "/api/{url}",            "DownstreamScheme": "http",            "UpstreamPathTemplate": "/gate/{url}",            "UpstreamHttpMethod": ["Get", "Post"],            "UseServiceDiscovery": true,            "ServiceName": "PatrickLiuService",            "LoadBalancerOptions": { "Type": "RoundRobin" }        }    ],    "GlobalConfiguration": {        "BaseUrl": "http://localhost:6299",        "ServiceDiscoveryProvider": {            "Host": "localhost",            "Port": 8090,            "Type": "Consul",            "PollingInterval": 1000,            "Token": "footoken"        }    }}
  • 启动网关:通过dotnet run命令启动Ocelot服务。

  • IdentityServer4认证与授权

    IdentityServer4是用于开源认证与授权的强大工具。我们需要配置它并与Ocelot网关集成。

    配置步骤

  • 安装IdentityServer4:使用NuGet安装IdentityServer4和相关插件。

  • 配置Startup.cs

    services.AddAuthentication("Bearer")    .AddIdentityServerAuthentication("UserGatewayKey", options => {        options.Authority = "http://localhost:7299";        options.ApiName = "UserApi";        options.RequireHttpsMetadata = false;        options.SupportedTokens = SupportedTokens.Both;    });
  • 创建客户端配置

    public class ClientInitConfig{    public static IEnumerable
    GetApiScopes() => new List
    { new ApiScope(name: "User.Get", displayName: "获取用户数据"), new ApiScope(name: "Health.Check", displayName: "健康检查") }; public static IEnumerable
    GetApiResources() => new List
    { new ApiResource("UserApi", "Invoice API") { Scopes = new[] { "User.Get", "Health.Check" } } }; public static IEnumerable
    GetClients() => new List
    { new Client { ClientId = "PatrickLiu.MicroService.AuthenticationDemo", ClientSecrets = new[] { new Secret("PatrickLiu123456".Sha256()) }, AllowedGrantTypes = GrantTypes.ClientCredentials, AllowedScopes = new[] { "User.Get", "Health.Check" }, Claims = new List
    { new ClientClaim(IdentityModel.JwtClaimTypes.Role, "Admin"), new ClientClaim(IdentityModel.JwtClaimTypes.NickName, "PatrickLiu"), new ClientClaim("eMail", "PatrickLiu@sina.com") } } };}
  • 启动认证中心:通过dotnet run命令启动IdentityServer4。


  • 测试与验证

  • 启动服务实例:使用dotnet run命令启动每个服务实例。
  • 验证服务注册:在Consul界面确认服务实例已注册。
  • 测试网关:通过PostMan发送请求,确保认证和授权工作正常。
  • 验证Token过期:使用Jwt.io验证Token,确保过期时间正确。

  • 总结

    通过以上步骤,我们成功搭建了一个基于Consul集群、Ocelot网关和IdentityServer4的微服务架构。虽然当前版本已经实现了基本功能,但还有许多优化空间。例如,Token过期机制可以进一步精简,客户端集成可以添加更多细节。接下来,我们将将所有服务迁移到Linux服务器,并使用Docker进行虚拟化部署,这将是下一篇文章的重点。

    转载地址:http://qwukz.baihongyu.com/

    你可能感兴趣的文章
    No module named cv2
    查看>>
    No module named tensorboard.main在安装tensorboardX的时候遇到的问题
    查看>>
    No qualifying bean of type XXX found for dependency XXX.
    查看>>
    No resource identifier found for attribute 'srcCompat' in package的解决办法
    查看>>
    Node.js 文件系统的各种用法和常见场景
    查看>>
    node.js 配置首页打开页面
    查看>>
    node.js+react写的一个登录注册 demo测试
    查看>>
    Node.js安装与配置指南:轻松启航您的JavaScript服务器之旅
    查看>>
    Node.js的循环与异步问题
    查看>>
    nodejs libararies
    查看>>
    nodejs-mime类型
    查看>>
    nodejs中Express 路由统一设置缓存的小技巧
    查看>>
    Node入门之创建第一个HelloNode
    查看>>
    NOIp2005 过河
    查看>>
    NotImplementedError: Cannot copy out of meta tensor; no data! Please use torch.nn.Module.to_empty()
    查看>>
    npm run build 失败Compiler server unexpectedly exited with code: null and signal: SIGBUS
    查看>>
    npm WARN deprecated core-js@2.6.12 core-js@<3.3 is no longer maintained and not recommended for usa
    查看>>
    npm前端包管理工具简介---npm工作笔记001
    查看>>
    npm和yarn的使用对比
    查看>>
    npm报错unable to access ‘https://github.com/sohee-lee7/Squire.git/‘
    查看>>