服务发现:Consul比JHipster Register有点多,但是后者有GUI。
microservice gateway负责处理web流量,并提供一个angular应用。
jhipster registry是一个独立的引用,所有的应用都在registry上面注册,并且从这里获取配置信息,它还提供一个监控界面。
jhipster uaa是一个用户验证和授权的系统,使用OAuth2协议,这也是我使用微服务的初衷。
微服务处理rest请求,是无状态的,所以可以有多个实例,用来处理繁重的负载。
jhipster console是一个监控和报警控制台,基于elasticsearch,logstash,kibana,这个应该很有价值,需要用用看。
网关和微服务都需要事先注册到registry。
网关负责http请求的路由,从而找到微服务,并把请求交给他。如果相同名称的微服务有多个,网关会使用Netflix Ribbon
做负责均衡;如果有为服务crash了,网管会用Netflix Hystrix有效地移除这些微服务。学名叫circuit breaker.
每个网关都能够监控http路由和微服务实例,这可以通过admin > gateway菜单来达成。
网关还能对请求的速度进行限制,可以按照ip地址,也可以按照登陆的用户进行限制,这项功能使用Bucket4j和Hazelcast来达成。
如果请求过快,网关会发送http 429表示太多的请求。
网关控制每个微服务,暴露哪些api,不暴露哪些api。
服务发现:jhipster registry
三个作用:
1. Eureka服务器
2. spring cloud config服务器
3. 微服务应用程序的管理服务器
开发模式下,这个registry会在本地目录central-config中找配置信息。
产品模式下(prod),会从git仓库中加载配置信息,代码中默认git仓库为:
https://github.com/jhipster/jhipster-registry-sample-config
真正自己的产品上线时,需要改成自己的git仓库,这个位置在src/main/resources/config/bootstrap-prod.yml文件里面编辑。
也有docker-compose方式可以运行registry,在研发状态下用./mvnw来运行regsitry。
打包就用./mvnw -Pprod package,但是docker hub上面已经有现成的包了,而且提供了docker-compose文件,改吧改吧就行了。
在产品上registry实例必须部署到云上(真的?必须在cloud foundry或者heroku上面?),
网关是如何知道有哪些微服务存在,以及那些微服务实例活着呢?答案是通过jhipster registry., 这个在技术上是如何实现的呢?答案是通过Hazelcast分布式内存缓存来达成的。
registry还是一个spring config服务器,每当微服务应用启动时,他们需要首先连接到registry上面获取运行时的配置信息,这个不光对微服务,网管也是一样。
配置格式就是spring boot的格式,一般都是写在yml文件中的,存储在一个集中位置。
到底是从本地文件取配置信息,还是从git中获取配置信息,这是在bootstrap.yml文件中定义的,具体在:
spring.cloud.config.server.composite属性中。
在哪里定义某个微服务的配置信息呢?比如一个微服务叫做ms1, 那么在git中添加一个ms1-prod.yml文件,这个文件就是产品版的ms1启动时加载的配置文件,
如果嫌弃每个微服务一个配置文件麻烦,可以把所有的配置信息定义在application[-dev|prod].yml文件中。
网关的路由信息也可以按照这种方式配置。
UAA特点:
1. OAuth2
2. 集中验证
3. 无状态
4. 区分用户和机器
5. 细粒度的访问控制,授权是在微服务中进行的,但是微服务不应该自己去识别用户,只需直接授权就行。
6. 可扩展,防止单点失败
所有访问微服务的客户端(web-app,内部,等等)都需要在UAA中定义。
用户访问通过roles角色和RBAC进行配置。role based access control
机器访问通过scopes范围和RBAC进行配置,
复杂访问通过ABAC来配置,attribute-based access control, 比如调用hasRole("ADMIN")和hasScope("shop-manager.read")
UAA干了三件事:
1. 提供用户domain信息,包含user,account资源,在有jwt验证的前提下。
2. 为OAuth2实现AuthorizationServerConfigurerAdapter,定义了基本的客户端(“web_app"和”internal")
3. 为所有别的微服务提供jwt 公共密钥 /oauth/token_key
启动微服务之前,必须先启动UAA,UAA ---》 microservices,这是因为别的为服务需要先获取jwt公共key。
hystrix: a circuit breaker system solving fall-back scenarios on service fails
断路器,解决单点服务失败
加入一个微服务调用另外一个微服务的端点EndPoint
需要用到Feign客户端,就和repository类似。定义接口。另外需要定义
@EnableFeignClients,否则会报错,说需要定义FeignClient的Bean,就是因为ComponentScan不认识@FeignClient。
另外
@FeignClient(name = "hduaa"), name就是另外一个服务的名字。
另外Feign和Hystrix一起用的时候,需要设置
feign:
client:
config:
default:
connectTimeout: 160000000
readTimeout: 160000000
另外需要设置:
hystrix:
command:
default:
execution:
timeout:
enabled: false
否则会导致TimeOut错误。