springcloud~演化的微服务架构

微服务

将总体功能按着模块划分红多个独立的单元,这些单元能够独立部署,它们以前经过轻量级的web api方式进行通信,对于微服务框架来讲,最流行的就是springcloud和Service Fabric,前者是java开发,后者是.net的产品,今天主要介绍一下springcloud!java

参考文章:https://dzone.com/articles/microservice-architecture-with-spring-cloud-and-doweb

  1. 功能即服务
  2. 配置中心
  3. 服务注册和发现
  4. 熔断器和监视器
  5. 解耦和异步通和的消息队列
  6. Api网关
  7. 统一受权服务
  8. Feign代替传统的Http

功能即服务-Functional Servicesspring

每一个功能为一个服务,能够独立部署api

METHOD PATH DESCRIPTION
GET /accounts/{account} Get specified account data
GET /accounts/current Get current account data
GET /accounts/demo Get demo account data (pre-filled incomes/expenses items, etc)
PUT /accounts/current Save current account data
POST /accounts/ Register new account

配置中心-Config Server安全

全部项目的配置信息都存储在远程,启动后同步到本地,有过时机制app

spring:
  application:
    name: notification-service
  cloud:
    config:
      uri: http://config:8888
      fail-fast: true

服务注册和发现-Eureka框架

每一个服务在启动后都被注册到eureka里,其它服务从eureka里经过服务名拿到服务的地址,进行调用异步

spring:
  application:
    name: notification-service

熔断器和监视器- Hystrix Dashboard微服务

当服务进行相互调用后,它多是多层次的调用,当某一层出现问题后,它下面的服务就不须要等待超时了,直接返回失败,这就是熔断器;而每一个服务运行的状态可使用监视器查看到。测试

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@EnableHystrixDashboard
@EnableCircuitBreaker
public class ConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}

解耦和异步通和的消息队列

队列服务用了比较流行的rabbitmq,比起kafka来讲,它不只更轻,并且更安全,有本身的ack机制!

Api网关

请求走统一的入口,而后根据配置去反向代理,通常地会在当前入口后加一个二级路径便可,在客户端看来他就好像是一个系统!

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

统一受权服务

全部接口均可以被受权注解统一拦截,进行受权,通常采用oauth2的协议!

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

Feign代替传统的Http

Feign是经过定义本地接口来模拟对远程接口的调用的,在生产环境中它会使用服务名+Feign接口路径来实现对远程资源的调用,而在测试环境里,他又会根据你mock的接口进行调用,这对于TDD开发是很是必要的,你在测试时不须要依赖外部资源!

@FeignClient(name = "statistics-service")
public interface StatisticsServiceClient {
    @RequestMapping(method = RequestMethod.PUT, value = "/statistics/{accountName}", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    void updateStatistics(@PathVariable("accountName") String accountName, Account account);
}

几大服务组件的默认端口对应表

  • localhost:80 - Gateway
  • localhost:8761 - Eureka Dashboard
  • localhost:9000 - Hystrix Dashboard
  • localhost:8989 - Turbine stream (source for Hystrix Dashboard)
  • localhost:15672 - RabbitMq management

 感谢各位的阅读!

相关文章
相关标签/搜索