Akka 与 微服务
所属分类 akka
浏览量 716
Akka 实现微服务 函数式 异步 分布式 高并发 可扩展 反应式
配置
Java Properties
Typesafe Config
Typesafe Config使用HOCON(Human-Optimized Config Object Notation)语言来编写配置
https://github.com/lightbend/config
val cc = ConfigFactory.parseString("""{}""") // .load()
val c = ConfigFactory.defaultOverrides().withFallback(cc)
val config = c.withFallback(ConfigFactory.load()).resolve()
defaultOverrides函数将JVM命令行参数解析到一个Config
同时将其与cc合并(JVM命令行参数将覆盖cc里相同键的值)
将合并了命令行参数的配置再与Typesafe Config默认配置合并,得到最终的配置
服务发现
Akka Discovery是Akka团队专为Akka生态开发的服务发现接口
提供了统一的服务发现API,但并不实现具体的服务发现功能
支持 DNS 静态配置 k8s等服务发现功能
服务API、服务拆分、服务发现、服务治理
HTTP RESTful
gRPC Thrift Dubbo
序列化
JSON Protobuf
Akka HTTP 提供丰富的HTTP特性,支持HTTP 1.0、1.1、2.0
Akka HTTP 提供 Routing DSL高级API来定义服务接口
val route =
path("hello") {
get {
complete(HttpEntity(ContentTypes.`text/html(UTF-8)`, "hello akka-http"))
}
}
gRPC使用Protobuf进行数据序列化,基于HTTP2提供RPC通信
akka-grpc
gRPC 与 REST SOAP MessageBus 和 Akka Remoting 的区别
集群
Akka基于actor模型,天然就是分布式的
Akka Cluster对于集群提供了原生支持
服务与服务之间通过Akka Discovery来做服务发现,gRPC为通信协议
有状态服务内多个实例之间使用Akka Cluster来形成一个服务的小集群
对于多个实例之间需要共享数据的情况,可以使用Akka Distributed Data
使用Akka Discovery + Akka gRPC构建微服务集群
akka.grpc.client {
"sample.HelloService" {
service-discovery {
mechanism = "nacos"
service-name = "sample-hello"
}
use-tls = false
}
# 可配置更多服务发现 endpoint
}
Akka Cluster可用于业务服务内部
Akka Cluster Singleton
任务调度
通常只会有一个实例管理任务调度
其它实例只做为具体执行任务的Worker
容错高可用 在Primary节点挂掉是可自动选择其中一个提升为Primary以继续管理任务调度
Akka Cluster Singleton 为此类 Primary/Secondary模式提供支持
声明为Singleton的actor在集群内有且只有一个实例存在,在Primary节点挂点后会自动将Singleton actor转移到其它节点
Akka Distributed Data
服务内需要共享数据、计算的情况,可以使用 Akka Distributed Data
比如集中式缓存(譬如 redis)、计数(用户积分计算)等
Akka Distributed Data使用了CRDTs(Conflict Free Replicated Data Type)
所有数据项都通过直接复制或基于gossip协议传播到所有节点或具有特定角色(role)的节点
还可以对读、写的一致性进行细粒度的控制
反应式(Reactive)
反应式宣言
https://www.reactivemanifesto.org/zh-CN
Akka Streams
Akka Streams 是用来实现反应式系统的核心
从数据的接收(Akka HTTP),到数据存储(Alpakka JDBC、Alpakka Kafka)
可以基于Akka Stream打通整个数据流
Akka Streams为反应式流开发提供了易于使用的DSL,内建回压支持
Slick是针对Scala语言实现的函数式关系映射库(Functional Relational Mapping,FRM)
使得对数据库的操作变得容易,就像操作Scala集合库(Collection)一样
Slick也支持直接使用SQL语句 Slick Plain SQL
val q3 = for {
c <- coffees if c.price < 9.0
s <- c.supplier
} yield (c.name, s.name)
// Equivalent SQL code:
// select c.COF_NAME, s.SUP_NAME from COFFEES c, SUPPLIERS s where c.PRICE < 9.0 and s.SUP_ID = c.SUP_ID
直接使用SQL
// A value to insert into the statement
val state = "CA"
// Construct a SQL statement manually with an interpolated value
val plainQuery = sql"select SUP_NAME from SUPPLIERS where STATE = $state".as[String]
上一篇
下一篇
大数据scala基础
快学scala要点
akka Actor
class 和 case class 及 构造器参数
scala :=>Unit 与 :()=>Unit 区别
hbase读写流程