摘要:序主要有做服务发现做分布式配置做做客户端负载均衡做断路器做聚合的做指标监控。配置访问配置访问实例调用其他微服务使用使用访问转向使用访问配置的目前看来每秒发送一次貌似太频繁可以另起一个进行访问参考
序
主要有eureka做服务发现、config做分布式配置、zuul做api-gateway、feign做客户端负载均衡、hystrix做断路器、turbine做聚合的monitor、graphite做指标监控。
eurekapom配置
org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator org.springframework.cloud spring-cloud-starter-eureka-server junit junit test
application.yml
server: port: 8761 eureka: instance: hostname: discovery client: registerWithEureka: false fetchRegistry: false serviceUrl: defaultZone: http://discovery:${server.port}/eureka/ spring.cloud.config.discovery.enabled: true
bootstrap.yml
spring: application: name: discovery
application
@SpringBootApplication @EnableEurekaServer public class EurekaApplication { public static void main( String[] args ) { SpringApplication.run(EurekaApplication.class, args); } }
访问
http://192.168.99.100:8761/
configpom配置
org.springframework.cloud spring-cloud-starter org.springframework.cloud spring-cloud-config-server org.springframework.cloud spring-cloud-starter-eureka
application.yml
spring: cloud: config: server: native: search-locations: classpath:/config server: port: 8888
bootstrap.yml
spring: application: name: config profiles: active: native eureka: instance: preferIpAddress: true client: service-url: defaultZone: http://discovery:8761/eureka/
application
@SpringBootApplication @EnableConfigServer @EnableEurekaClient public class ConfigApplication { public static void main( String[] args ) { SpringApplication.run(ConfigApplication.class,args); } }
访问
http://192.168.99.100:8888/review/default/master
feign实例pom
org.springframework.cloud spring-cloud-starter org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator org.springframework.cloud spring-cloud-config-client org.springframework.cloud spring-cloud-starter-eureka com.codecraft common 1.0-SNAPSHOT org.springframework.cloud spring-cloud-starter-ribbon org.springframework.cloud spring-cloud-starter-feign org.springframework.cloud spring-cloud-starter-hystrix org.springframework.cloud spring-cloud-starter-hystrix-dashboard
application.yml
server: port: 9001 endpoints: restart: enabled: true shutdown: enabled: true health: sensitive: false ribbon: eureka: enabled: true
bootstrap.yml
spring: application: name: product cloud: config: uri: http://config:8888 encrypt: failOnError: false eureka: instance: preferIpAddress: true client: registerWithEureka: true fetchRegistry: true serviceUrl: defaultZone: http://discovery:8761/eureka/
FeignClient
@FeignClient("recommend") public interface RemoteRecommendService { @RequestMapping(method = RequestMethod.GET,value = "/recommend") public ListgetRecommendations( @RequestParam(value = "productId", required = true) int productId); }
feign使用
@RestController public class ProductController { private static final Logger LOG = LoggerFactory.getLogger(ProductController.class); @Autowired private SetProcTimeBean setProcTimeBean; @Autowired RemoteRecommendService remoteRecommendService; @RequestMapping("/product/recommends") @HystrixCommand(fallbackMethod = "callRecommendFallback", commandProperties = { @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "100") }) public ListremoteRecommends(@RequestParam(value = "productId", required = true) int productId){ return remoteRecommendService.getRecommendations(productId); } public List callRecommendFallback(int productId) { return Collections.emptyList(); } @RequestMapping("/product/{productId}") public Product getProduct(@PathVariable int productId) { int pt = setProcTimeBean.calculateProcessingTime(); LOG.info("/product called, processing time: {}", pt); sleep(pt); LOG.debug("/product return the found product"); return new Product(productId, "name", 123); } }
application
@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients @EnableCircuitBreaker @EnableHystrix @EnableHystrixDashboard public class ProductApplication { private static final Logger LOG = LoggerFactory.getLogger(ProductApplication.class); public static void main(String[] args){ SpringApplication.run(ProductApplication.class,args); LOG.info("Register ShutdownHook"); Runtime.getRuntime().addShutdownHook(new Thread(){ @Override public void run() { LOG.info("Shutting down product service, unregister from Eureka!"); DiscoveryManager.getInstance().shutdownComponent(); } }); } }api-gateway
pom
org.springframework.cloud spring-cloud-starter-zuul org.springframework.cloud spring-cloud-starter-eureka org.springframework.cloud spring-cloud-starter org.springframework.cloud spring-cloud-starter-config org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator
application.yml
server: port: 10000 #sidecar: #port: 8000 endpoints: restart: enabled: true shutdown: enabled: true health: sensitive: false zuul: ignored-services: "*" routes: product: path: /product/** url: http://product:9001/product recommend: path: /recommend/** url: http://recommend:9002/recommend review: path: /review/** url: http://review:9003/review
bootstrap.yml
spring: application: name: gateway cloud: config: uri: http://config:8888 encrypt: failOnError: false eureka: instance: preferIpAddress: true client: registerWithEureka: true fetchRegistry: true serviceUrl: defaultZone: http://discovery:8761/eureka/
application
@SpringBootApplication @EnableCircuitBreaker @EnableDiscoveryClient @EnableZuulProxy public class ApiGatewayApplication { public static void main( String[] args ) { new SpringApplicationBuilder(ApiGatewayApplication.class).web(true).run(args); } }
访问
http://192.168.99.100:10000/recommend?productId=1
转向
http://192.168.99.100:9002/recommend?productId=1
http://192.168.99.100:9001/product/recommends?productId=1
http://192.168.99.100:9001/hystrix
http://192.168.99.100:9003/hystrix/monitor?stream=http%3A%2F%2F192.168.99.100%3A9001%2Fhystrix.stream
turbinepom
org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-starter org.springframework.cloud spring-cloud-starter-turbine org.springframework.boot spring-boot-starter-actuator org.springframework.cloud spring-cloud-config-client org.springframework.cloud spring-cloud-starter-eureka org.springframework.cloud spring-cloud-starter-hystrix org.springframework.cloud spring-cloud-starter-hystrix-dashboard
application.yml
server: port: 8889 eureka: instance: preferIpAddress: true client: registerWithEureka: true fetchRegistry: true serviceUrl: defaultZone: http://discovery:8761/eureka/ turbine: appConfig: product,review clusterNameExpression: new String("default")
bootstrap.yml
spring: application: name: turbine cloud: config: uri: http://config:8888 encrypt: failOnError: false
application
@SpringCloudApplication @EnableTurbine @EnableHystrixDashboard public class TurbineApplication { public static void main(String[] args){ SpringApplication.run(TurbineApplication.class,args); } }
访问
http://192.168.99.100:9001/hystrix
http://192.168.99.100:9001/product/recommends?productId=1
http://192.168.99.100:9003/review/product/100
pom
org.springframework.boot spring-boot-starter-actuator org.springframework.boot spring-boot-starter-test test io.dropwizard.metrics metrics-core ${dropwizard-metrics.version} io.dropwizard.metrics metrics-graphite ${dropwizard-metrics.version} io.dropwizard.metrics metrics-annotation ${dropwizard-metrics.version} io.dropwizard.metrics metrics-jvm ${dropwizard-metrics.version} com.ryantenney.metrics metrics-spring 3.1.0 spring-beans org.springframework spring-aop org.springframework
configuration
@Configuration @AutoConfigureAfter(MetricRepositoryAutoConfiguration.class) @ConditionalOnProperty(prefix = "graphite", name = "enabled", matchIfMissing = true) @EnableConfigurationProperties(GraphiteProperties.class) @EnableScheduling @EnableMetrics public class GraphiteAutoConfiguration { private static final Logger logger = LoggerFactory.getLogger(GraphiteAutoConfiguration.class); @Bean public MetricsConfigurerAdapter metricsConfigurerAdapter(final GraphiteProperties graphiteProperties) { return new GraphiteReportingManager(graphiteProperties); } /** * https://qbgbook.gitbooks.io/spring-boot-reference-guide-zh/content/IV.%20Spring%20Boot%20features/36.3.3.%20Property%20conditions.html * @param graphiteProperties * @param metricRegistry * @return */ @Bean @ConditionalOnProperty(value = "graphite.host",matchIfMissing = true) public ConsoleReporter consoleReporter(GraphiteProperties graphiteProperties,MetricRegistry metricRegistry) { ConsoleReporter.Builder builder = ConsoleReporter.forRegistry(metricRegistry); ConsoleReporter reporter = builder.build(); reporter.start(graphiteProperties.getReportInterval(), TimeUnit.MILLISECONDS); return reporter; } }
report
public class GraphiteReportingManager extends MetricsConfigurerAdapter implements DisposableBean { private final Logger logger = LoggerFactory.getLogger(getClass()); private GraphiteProperties props; public GraphiteReportingManager(GraphiteProperties props) { this.props = props; } @Override public void configureReporters(MetricRegistry metricRegistry) { //gc的metrics,目前看来每秒发送一次貌似太频繁,可以另起一个reporter进行 metricRegistry.register("jvm.gc", new GarbageCollectorMetricSet()); metricRegistry.register("jvm.mem", new MemoryUsageGaugeSet()); metricRegistry.register("jvm.thread-states", new ThreadStatesGaugeSet()); logger.info("graphite host:{},port:{}", props.getHost(), props.getPort()); GraphiteReporter reporter = GraphiteReporter.forRegistry(metricRegistry) .prefixedWith(props.getPrefix()) // .convertRatesTo(TimeUnit.SECONDS) .convertDurationsTo(TimeUnit.MILLISECONDS) .filter(MetricFilter.ALL) .build(createSender(props)); registerReporter(reporter); reporter.start(1L, TimeUnit.SECONDS); } @Override public void destroy() throws Exception { super.destroy(); } private GraphiteSender createSender(GraphiteProperties props) { switch (props.getSenderType()) { case udp: return new GraphiteUDP(props.getHost(), props.getPort()); case tcp: return new Graphite(props.getHost(), props.getPort()); case pickled: return new PickledGraphite(props.getHost(), props.getPort()); default: return new GraphiteUDP(props.getHost(), props.getPort()); } } }
访问
http://192.168.99.100:8070/
参考Blog Series - Building Microservices
git.blog-microservices
exposing-jvm-metrics-in-spring-boot
git.spring-boot-jvm-monitoring-demo
exporting-to-graphite-with-the-prometheus-java-client
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/65941.html
摘要:序主要有做服务发现做分布式配置做做客户端负载均衡做断路器做聚合的做指标监控。配置访问配置访问实例调用其他微服务使用使用访问转向使用访问配置的目前看来每秒发送一次貌似太频繁可以另起一个进行访问参考 序 主要有eureka做服务发现、config做分布式配置、zuul做api-gateway、feign做客户端负载均衡、hystrix做断路器、turbine做聚合的monitor、grap...
摘要:服务提供者的运行机制用了双层结构来维护注册的服务信息,第一层为服务的名称,第二层为服务的实例名称。服务注册中心的运行机制为了防止服务的异常下线,会周期性的清理列表中未续约的服务。负载均衡器的基本功能维护该服务下的所有节点列表。 Spring Boot Spring Boot有什么作用 Spring Boot通过自动化的配置简化Spring原有的样板化的配置。 Spring Boo...
摘要:刘超,网易云计算首席架构师,有多年的云计算架构与开发经历,积累了丰富的企业级应用的微服务化,容器化实战经验。近日,记者对刘超进行了采访,跟大家分享了微服务实战的挑战和一些常见的微服务误解,以及他对微服务发展趋势的判断。 刘超,网易云计算首席架构师,有10多年的云计算架构与开发经历,积累了丰富的企业级应用的微服务化,容器化实战经验。刘超将担任今年 5 月份 QCon 全球软件开发大会广州...
摘要:微服务集成服务间通信微服务架构下,应用的服务直接相互独立。微服务架构倾向于降低中心消息总线类似于的依赖,将业务逻辑分布在每个具体的服务终端。 引言:微服务是当前软件架构领域非常热门的词汇,能找到很多关于微服务的定义、准则,以及如何从微服务中获益的文章,在企业的实践中去应用微服务的资源却很少。本篇文章中,会介绍微服务架构(Microservices Architecture)的基础概念,...
阅读 924·2021-11-22 09:34
阅读 2136·2021-11-11 16:54
阅读 2165·2021-09-27 14:00
阅读 910·2019-08-30 15:55
阅读 1498·2019-08-29 12:46
阅读 571·2019-08-26 18:42
阅读 605·2019-08-26 13:31
阅读 3152·2019-08-26 11:52