Scala微服务架构 一
Scala微服务架构 一因为公司的一个项目需求变动会非常频繁,同时改动在可控范围内,加上产品同学喜欢一些超前思维,我们的CTO决定提前开启八门,使用微服务架构。 那么什么是微服务架构呢? 1.1 微服务架构“微服务”架构是近期软件应用领域非常热门的概念。 1.1.1 什么是微服务架构微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。在所有情况下,每个任务代表着一个小的业务能力。 特点也就是说,微服务就是SOA的变种,在保证SOA业务分离能力的同时,减少每个业务粒度,同时去除了SOA中比较恼人的ESB. 自由组装这个图片从资源利用率的角度,体现了微服务一个非常给力的优点 数据分离同时,对应用组件封装的方式是整体架构与微服务架构的主要差异,微服务架构将相关联的业务逻辑及数据放在一起形成独立的边界,其目的是能在不影响其他应用组件(微服务)的情况下更快地交付并推出市场。 1.2 前后对接协议 JsonApi官网 1.3 本期语法糖1.3.1 Scala的Package Object官网讲解https://www.scala-lang.org/docu/files/packageobjects/packageobjects.html // in file gardening/fruits/Fruit.scala package gardening.fruits case class Fruit(name: String,color: String) object apple extends Fruit("Apple","green") object plum extends Fruit("Plum","blue") object banana extends Fruit("Banana","yellow") 上面我在 如果想使用直接使用上面定义的几个Object,可以这样 package com object main { import gardening.fruits._ val planted = List(apple,plum,banana) def showFruit(fruit: Fruit) { println(fruit.name +"s are "+ fruit.color) } } 但是,其实我们还有更简洁的调用方式,各位也已经猜到了,就是 // in file gardening/fruits/package.scala package gardening package object fruits { val planted = List(apple,banana) def showFruit(fruit: Fruit) { println(fruit.name +"s are "+ fruit.color) } } 这里要注意,思想不要局限,反过来也是可以的,比如在 1.3.2 Scala的自定义注解(Annotation)本段摘自 Annotation (注解)的介绍Scala中的注解语法与Java中类似。 注解的基本语法为: @注解名称(注解参数...) val a = ??? 与Java注解的用法类似,注解参数不是必须的,一个元素允许拥有多个注解。 Annotation的定义
两类注解特质都继承自基类scala.annotation.Annotation.
定义注解类语法与普通类相同: // 标记注解 class 注解名称 extends StaticAnnotation/ClassfileAnnotation // 有参注解 class 注解名称(参数表...) extends StaticAnnotation/ClassfileAnnotation Annotation的解析通过反射机制获取注解信息,相关API位于 获取注解:
解析注解Dome: import scala.annotation.StaticAnnotation import scala.reflect.runtime.universe._ class CustomAnnotation(name: String,num: Int) extends StaticAnnotation { override def toString = s"Annotation args: name -> $name,num -> $num" } @CustomAnnotation("Annotation for Class",2333) class Test { @CustomAnnotation("Annotation for Class",6666) val ff = "" } object Main extends App { { // 获取类型注解 val tpe: Type = typeOf[Test] val symbol: Symbol = tpe.typeSymbol //获取类型符号信息 val annotation: Annotation = symbol.annotations.head val tree: Tree = annotation.tree //获取语法树 // 解析注解语法树... } { // 获取成员字段注解 val tpe: Type = typeOf[Test] val symbol: Symbol = tpe.decl(TermName("ff ")) //获取字段符号信息 val annotation: Annotation = symbol.annotations.head val tree: Tree = annotation.tree // 解析注解语法树... } } 1.3.3 Scala的implicit用法平时我们比较常见的应该是使用 def divide(x: Int,y: Int)(implicit i2d: Int => Double): Double 则调用上述的 divide(1,2)(i => i.toDouble) 如果在当前名称空间中,正好有了这个 implicit val test: Int => Double = i => i.toDouble 则函数调用的时候,则可以省略后面的隐式传入,编译器会自动使用当前名称空间的可用隐式,调用就变为: divide(1,2) Implicit class那么问题来了,如果implicit修饰的是class呢? // 定义 object Helpers { implicit class IntWithTimes(x: Int) { def times[A](f: => A): Unit = { def loop(current: Int): Unit = if(current > 0) { f loop(current - 1) } loop(x) } } } // 调用 object main { import Helpers._ 5 times println("HI") } 可以发现,
Implicit object那么implicit修饰object又是什么鬼呢? 下面是个非常常见的例子: object Math { trait NumberLike[T] { def plus(x: T,y: T): T def divide(x: T,y: Int): T def minus(x: T,y: T): T } object NumberLike { implicit object NumberLikeDouble extends NumberLike[Double] { def plus(x: Double,y: Double): Double = x + y def divide(x: Double,y: Int): Double = x / y def minus(x: Double,y: Double): Double = x - y } implicit object NumberLikeInt extends NumberLike[Int] { def plus(x: Int,y: Int): Int = x + y def divide(x: Int,y: Int): Int = x / y def minus(x: Int,y: Int): Int = x - y } } } 实际上,看到的隐式object我们可以认为它就是 implicit val NumberLikeDouble: NumberLike[Double] = new NumberLike[Double] { ... } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- twitter-bootstrap – 如何在symfony2中使用assetic和less使
- -bash:[:@:二元运算符预期
- scala – Lazy foldRight提前终止混乱
- bash – 找出安装脚本是否在mac或linux机器上运行
- 官方Angular 2 http教程中的私有变量命名约定
- angular – IE11和Edge中Bootstrap模式上的渲染工件
- 如何在更改输入约束后更新AngularJS中的表单控制器
- 使用AngularJS选择ng-options和Semantic UI的下拉列表
- Scala – 模式匹配“case Nil”为Vector
- bootstrap tooltip 回车换行