James Lewis是ThoughtWorks的首席顾问,也是技术顾问委员会的成员。James利用小型协作服务构建应用程序的兴趣源于大规模集成企业系统的背景。他使用微服务构建了许多系统,并且几年来一直积极参与不断发展的社区。
Martin Fowler是一位关于软件开发的作者,演讲者和一般的嗓音。他长期以来一直对如何组装软件系统的问题感到困惑,他听到的声明比他满意的更加模糊。他希望微服务能够实现其倡导者所发现的早期承诺。
https://www.martinfowler.com/articles/microservices.html
“微服务” - 在拥挤的软件架构街道上又一个新名词。虽然我们的自然倾向是通过轻蔑的眼神传递这些东西,但这一点术语描述了我们发现越来越有吸引力的软件系统风格。我们已经看到许多项目在过去几年中使用了这种风格,到目前为止的结果是积极的,以至于对于我们的许多同事来说,这已成为构建企业应用程序的默认样式。然而,遗憾的是,没有太多信息可以概述微服务的风格以及如何实现。
“微服务” - 在软件架构拥挤的街道上又一个新名词。 尽管我们的自然倾向是以轻蔑的眼光来传递这样的东西,但这些术语描述了一种我们发现越来越吸引人的软件系统风格。 我们已经看到许多项目在过去几年中都采用了这种风格,迄今为止的结果是积极的,因此对于我们的许多同事来说,这正成为构建企业应用程序的默认风格。 可悲的是,没有太多的信息概述了微服务的风格以及如何去做。
– 出自Google翻译 –
简而言之,微服务架构风格[1]是一种将单个应用程序开发为一套小型服务的方法,每个小型服务都在自己的流程中运行,并与轻量级机制(通常是HTTP资源API)进行通信。这些服务围绕业务功能构建,可通过全自动部署机制独立部署。这些服务至少集中管理,可以用不同的编程语言编写,并使用不同的数据存储技术。
简而言之,微服务架构风格[1]是一种将单个应用程序作为一套小型服务开发的方法,每种应用程序都在其自己的进程中运行,并与轻量级机制(通常是HTTP资源API)进行通信。 这些服务是围绕业务功能构建的,可以通过全自动部署机制独立部署。 这些服务的集中管理最少,可以用不同的编程语言编写,并使用不同的数据存储技术。
– 出自Google翻译 –
分散数据管理
去中心化数据管理
组件能针对不同的业务特点选择不同的存储技术
org.springframework.cloud
spring-cloud-starter-eureka-server
@EnableEurekaServer //@EnableEurekaServer 表示当前应用为服务注册中心
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
#配置application.yml
eureka:
client:
register-with-eureka: false #表示是否需要将自己注册到注册中心
fetch-registry: false # 是否向注册中心定时更新自己状态
Eureka client服务注册者
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.boot
spring-boot-starter-web
@EnableDiscoveryClient // 表示当前应用需要注册到注册中心
@SpringBootApplication
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
#配置application.yml
eureka:
client:
register-with-eureka: true #表示是否需要将自己注册到注册中心
fetch-registry: true # 是否向注册中心定时更新自己状态
service-url:
defaultZone: http://localhost:8761/eureka #注册中心地址
服务消费者 Feign
org.springframework.cloud
spring-cloud-starter-openfeign
@EnableDiscoveryClient
@EnableFeignClients //表示当前应用可以调用其他服务
@SpringBootApplication
public class EurekafeignApplication {
public static void main(String[] args) {
SpringApplication.run(EurekafeignApplication.class, args);
}
}
@FeignClient("servicename")
public interface FeignService {
@GetMapping("/xxx")
public String xxx();
}
@FeignClient: 表示要调用的服务,值为服务名称
当前类声明为接口
声明的方法和被调用的服务接口方法一致
通过@Autowired 声明并使用此服务
API网关
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.cloud
spring-cloud-starter-netflix-zuul
@EnableZuulProxy //表示当前应用是网关路由
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
zuul:
routes:
#分发到a服务
a.path: /a/** #分流哪些路径
a.serviceId: a-service #服务的名称
a.retryable: true #是否重试
#分发到b服务
b.path: /b/**
b.serviceId: b-service
b.retryable: true
host:
connect-timeout-millis: 30000 #连接超时
socket-timeout-millis: 30000 #响应超时
Hystrix Dashboard 断路器
在微服务架构中为例保证程序的可用性,防止程序出错导致网络阻塞,出现了断路器模型。断路器的状况反应了一个程序的可用性和健壮性,它是一个重要指标。Hystrix Dashboard是作为断路器状态的一个组件,提供了数据监控和友好的图形化界面。
org.springframework.cloud
spring-cloud-starter-hystrix-dashboard
org.springframework.cloud
spring-cloud-starter-hystrix
org.springframework.boot
spring-boot-starter-actuator
1.5.3.RELEASE
feign:
hystrix:
enabled: true
//在程序的入口ServiceHiApplication类,加上@EnableHystrix注解开启断路器,这个是必须的,并且需要在程序中声明断路点HystrixCommand;
//加上@EnableHystrixDashboard注解,开启HystrixDashboard
@EnableDiscoveryClient
@EnableHystrix
@EnableHystrixDashboard
@EnableFeignClients
@SpringBootApplication
public class Feign01Application {
public static void main(String[] args) {
SpringApplication.run(Feign01Application.class, args);
}
}
@FeignClient(value = "clh",fallback = DevCLHImpl.class) //需要创建DevCLH 的实现类DevCLHImpl 并实现对应方法
public interface DevCLH {
@RequestMapping("/dev01")
public String dev01();
}
打开http://localhost:8762/actuator/hystrix.stream,可以看到一些具体的数据:
data: {"type":"HystrixCommand","name":"DevCLH#dev01()","group":"clh","currentTime":1543753091734,"isCircuitBreakerOpen":false,"errorPercentage":0,"errorCount":0,"requestCount":0,"rollingCountBadRequests":0,"rollingCountCollapsedRequests":0,"rollingCountEmit":0,"rollingCountExceptionsThrown":0,"rollingCountFailure":0,"rollingCountFallbackEmit":0,"rollingCountFallbackFailure":0,"rollingCountFallbackMissing":0,"rollingCountFallbackRejection":0,"rollingCountFallbackSuccess":0,"rollingCountResponsesFromCache":0,"rollingCountSemaphoreRejected":0,"rollingCountShortCircuited":0,"rollingCountSuccess":0,"rollingCountThreadPoolRejected":0,"rollingCountTimeout":0,"currentConcurrentExecutionCount":0,"rollingMaxConcurrentExecutionCount":0,"latencyExecute_mean":0,"latencyExecute":{"0":0,"25":0,"50":0,"75":0,"90":0,"95":0,"99":0,"99.5":0,"100":0},"latencyTotal_mean":0,"latencyTotal":{"0":0,"25":0,"50":0,"75":0,"90":0,"95":0,"99":0,"99.5":0,"100":0},"propertyValue_circuitBreakerRequestVolumeThreshold":20,"propertyValue_circuitBreakerSleepWindowInMilliseconds":5000,"propertyValue_circuitBreakerErrorThresholdPercentage":50,"propertyValue_circuitBreakerForceOpen":false,"propertyValue_circuitBreakerForceClosed":false,"propertyValue_circuitBreakerEnabled":true,"propertyValue_executionIsolationStrategy":"THREAD","propertyValue_executionIsolationThreadTimeoutInMilliseconds":1000,"propertyValue_executionTimeoutInMilliseconds":1000,"propertyValue_executionIsolationThreadInterruptOnTimeout":true,"propertyValue_executionIsolationThreadPoolKeyOverride":null,"propertyValue_executionIsolationSemaphoreMaxConcurrentRequests":10,"propertyValue_fallbackIsolationSemaphoreMaxConcurrentRequests":10,"propertyValue_metricsRollingStatisticalWindowInMilliseconds":10000,"propertyValue_requestCacheEnabled":true,"propertyValue_requestLogEnabled":true,"reportingHosts":1,"threadPool":"clh"}
data: {"type":"HystrixThreadPool","name":"clh","currentTime":1543753091734,"currentActiveCount":0,"currentCompletedTaskCount":57,"currentCorePoolSize":10,"currentLargestPoolSize":10,"currentMaximumPoolSize":10,"currentPoolSize":10,"currentQueueSize":0,"currentTaskCount":57,"rollingCountThreadsExecuted":0,"rollingMaxActiveThreads":0,"rollingCountCommandRejections":0,"propertyValue_queueSizeRejectionThreshold":5,"propertyValue_metricsRollingStatisticalWindowInMilliseconds":10000,"reportingHosts":1}
ping:
打开localhost:8762/hystrix 可以看见以下界面:
在界面依次输入:http://localhost:8762/actuator/hystrix.stream 、2000 、miya
;点确定。
在另一个窗口输入: http://localhost:8762/hi?name=forezp