首页  

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读写流程