想要设计自己的微服务?看这篇文章就对了 (2)

现在,你的应用程序中不需要任何嵌入属性。只需提供 bootstrap.yml 应用程序名称和配置服务URL:

spring: application: name: notification-service cloud: config: uri: :8888 fail-fast: true 使用Spring Cloud Config,可以动态更改应用程序配置

例如, EmailService bean 使用注释 @RefreshScope。这意味着你可以更改电子邮件文本和主题行,而无需重建和重新启动Notification Service应用程序。

首先,在Config服务器中更改所需的属性。然后,对Notification服务执行刷新请求: curl -H "Authorization: Bearer #token#" -XPOST :8000/notifications/refresh

你还可以使用 。

注意

动态刷新有一些限制。 @RefreshScope 不适用于 @Configuration 类,不能影响 @Scheduled 方法。

fail-fast property表示如果Spring Boot应用程序无法连接到Config Service,则会立即失败启动。当你启动时,这非常有用 。

下面有重要的安全说明。

验证服务

授权职责完全提取到单独的服务器,该服务器 为后端资源服务授予 OAuth2令牌。Auth Server用于用户授权以及周边内部的安全机器到机器通信。

在这个项目中,我使用 授权类型进行用户授权(因为它仅由本机应用程序UI使用),并且 用作微服务授权的授权类型。

Spring Cloud Security提供方便的注释和自动配置,使服务器和客户端都能轻松实现。你可以在文档中了解有关它的更多信息, 并检查Auth Server代码中的配置详细信息 。

从客户端来看,一切都与传统的基于会话的授权完全相同。你可以从Principal 请求中检索 对象,使用基于表达式的访问控制和@PreAuthorize 注释检查用户角色和其他内容 。

PiggyMetrics中的每个客户端(帐户服务,统计服务,通知服务和浏览器)都有一个范围: server用于后端服务, ui - 用于浏览器。因此,我们还可以保护控制器免受外部访问,例如:

@PreAuthorize("#oauth2.hasScope('server')") @RequestMapping(value = "accounts/{name}", method = RequestMethod.GET) public List<DataPoint> getStatisticsByAccountName(@PathVariable String name) { return statisticsService.findByAccountName(name); } API网关

如你所见,有三种核心服务,它们将外部API暴露给客户端。在现实世界的系统中,这个数字可以非常快速地增长,并且整个系统的复杂性也会增加。实际上,渲染一个复杂的网页可能涉及数百种服务。

理论上,客户端可以直接向每个微服务发出请求。但显然这个选项存在挑战和局限,例如必须知道所有端点地址,分别对每个信息和平执行http请求,在客户端合并结果。另一个问题是非网络友好协议,可能在后端使用。

通常,更好的方法是使用API网关。它是进入系统的单一入口点,用于通过将请求路由到适当的后端服务或通过调用多个后端服务并聚合结果来处理请求 。此外,它还可用于身份验证,压力测试,服务迁移,静态响应处理,主动流量管理。

Netflix开源了 这样的优质服务,现在有了Spring Cloud,我们可以通过一个@EnableZuulProxy注释启用它 。在这个项目中,我使用Zuul存储静态内容(UI应用程序)并将请求路由到适当的微服务。以下是Notification服务的简单基于前缀的路由配置:

zuul: routes: notification-service: path: /notifications/** serviceId: notification-service stripPrefix: false

这意味着所有以请求开头的请求 /notifications 都将路由到Notification服务。可以看到,没有硬编码的地址。Zuul使用 机制来定位Notification服务实例以及 。

Service Discovery

另一种众所周知的架构模式是Service Discovery。它允许自动检测服务实例的网络位置,这些服务实例可能由于自动扩展,故障和升级而动态分配地址。

服务发现的关键部分是注册表。我在这个项目中使用了Netflix Eureka。当客户端负责确定可用服务实例的位置(使用注册服务器)并在它们之间加载平衡请求时,Eureka是客户端发现模式的一个很好的例子。

使用Spring Boot,你可以轻松地使用spring-cloud-starter-eureka-server 依赖项, @EnableEurekaServer 注释和简单配置属性构建Eureka Registry 。

通过@EnableDiscoveryClient 注释和 bootstrap.yml 应用程序名称启用客户端支持 :

spring: application: name: notification-service

现在,在应用程序启动时,它将向Eureka Server注册并提供元数据,例如主机和端口,运行状况指示器URL,主页等.Eureka从属于服务的每个实例接收消息。如果故障超过可配置的时间表,则实例将从注册表中删除。

此外,Eureka提供了一个简单的界面,你可以在其中跟踪正在运行的服务和可用实例的数量: :8761

img

负载均衡器,断路器和Http客户端

Netflix OSS提供了另一套很棒的工具。

Ribbon

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpgyyg.html