myspringcloud http://blog.okbase.net/iteye01 spring cloud微服务分布式云架构-Spring Cloud Netflix http://blog.okbase.net/iteye01/archive/56229.html iteye01 2019/3/14 15:52:06 该项目通过自动配置为Spring Boot应用程序提供Netflix OSS集成,并绑定到Spring环境和其他Spring编程模型成语。通过几个简单的注释,您可以快速启用和配置应用程序中的常见模式,并通过经过测试的Netflix组件构建大型分布式系统。提供的模式包括服务发现(Eureka),断路器(Hystrix),智能路由(Zuul)和客户端负载平衡(Ribbon)。Spring Cloud大型企业分布式微服务云架构源码请加一七九一七四三三八零

 服务发现:Eureka客户端

服务发现是基于微服务架构的关键原则之一。尝试配置每个客户端或某种形式的约定可能非常困难,可以非常脆弱。Netflix服务发现服务器和客户端是Eureka。可以将服务器配置和部署为高可用性,每个服务器将注册服务的状态复制到其他服务器。

  如何包含Eureka客户端

要在您的项目中包含Eureka客户端,请使用组`org.springframework.cloud`和工件ID `spring-cloud-starter-eureka`的启动器。有关使用当前的Spring Cloud发布列表设置构建系统的详细信息。

 注册Eureka

当客户端注册Eureka时,它提供关于自身的元数据,例如主机和端口,健康指示符URL,主页等。Eureka从属于服务的每个实例接收心跳消息。如果心跳失败超过可配置的时间表,则通常将该实例从注册表中删除。

示例eureka客户端:

 
@Configuration
@ComponentScan
@EnableAutoConfiguration
@EnableEurekaClient
@RestControllerpublic class Application {  
   @RequestMapping("/")  
  public String home() { 
       return "Hello world";    }     
public static void main(String[] args) {     
   new SpringApplicationBuilder(Application.class).web(true).run(args);  
  } }
 

(即完全正常的Spring Boot应用程序)。在这个例子中,我们明确地使用`@EnableEurekaClient`,但只有Eureka可用,你也可以使用`@EnableDiscoveryClient`。需要配置才能找到Eureka服务器。例:

application.yml

 
eureka: 
 client:   
 serviceUrl:     
 defaultZone: http://localhost:8761/eureka/
 

其中“defaultZone”是一个魔术字符串后备值,为任何不表示首选项的客户端提供服务URL(即它是有用的默认值)。

从`Environment`获取的默认应用程序名称(服务ID),虚拟主机和非安全端口分别为`${spring.application.name}`,`${spring.application.name}`和`${server.port}`。

`@EnableEurekaClient`将应用程序同时进入一个Eureka“实例”(即注册自己)和一个“客户端”(即它可以查询注册表以查找其他服务)。实例行为由`eureka.instance.*`配置键驱动,但是如果您确保您的应用程序具有`spring.application.name`(这是Eureka服务ID或VIP的默认值),那么默认值将是正常的。

]]>
spring cloud微服务分布式云架构-Spring Cloud Bus http://blog.okbase.net/iteye01/archive/56228.html iteye01 2019/3/14 15:51:41 spring CloudBus 将分布式的节点和轻量的消息代理连接起来。这可以用于广播配置文件的更改或者其他的管理工作。一个关键的思想就是,消息总线可以为微服务做监控,也可以作为应用程序之间相互通讯。Spring Cloud大型企业分布式微服务云架构源码请加一七九一七四三三八零

一、准备工作

本文还是基于上一篇文章来实现。按照官方文档,我们只需要在配置文件中配置 spring-cloud-starter-bus-amqp ;这就是说我们需要装rabbitMq,点击rabbitmq下载。至于怎么使用 rabbitmq,搜索引擎下。

二、改造config-client

在pom文件加入spring-cloud-starter-bus-amqp,完整的配置文件如下:
<dependencies>       
 <dependency>         
   <groupId>org.springframework.cloud</groupId>      
      <artifactId>spring-cloud-starter-config</artifactId>   
     </dependency>    
     <dependency>          
  <groupId>org.springframework.boot</groupId>   
         <artifactId>spring-boot-starter-web</artifactId>      
  </dependency> 
        <dependency>      
      <groupId>org.springframework.cloud</groupId>     
       <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>    
    </dependency>        
 <dependency>     
       <groupId>org.springframework.cloud</groupId>      
      <artifactId>spring-cloud-starter-bus-amqp</artifactId>   
     </dependency>   
      <dependency>           
 <groupId>org.springframework.boot</groupId>           
 <artifactId>spring-boot-starter-actuator</artifactId>       
 </dependency>

在配置文件application.properties中加上RabbitMq的配置,包括RabbitMq的地址、端口,用户名、密码。并需要加上spring.cloud.bus的三个配置,具体如下:

spring.rabbitmq.host=localhostspring.rabbitmq.port=5672spring.rabbitmq.username=guestspring.rabbitmq.password=guest
spring.cloud.bus.enabled=truespring.cloud.bus.trace.enabled=truemanagement.endpoints.web.exposure.include=bus-refresh
 

ConfigClientApplication启动类代码如下:

@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@RestController
@RefreshScopepublic class ConfigClientApplication {   
  /**     * http://localhost:8881/actuator/bus-refresh     */    
 public static void main(String[] args) {      
  SpringApplication.run(ConfigClientApplication.class, args);   
 } 
    @Value("${foo}")    
String foo;  
   @RequestMapping(value = "/hi")   
 public String hi(){     
   return foo;  
  }}
依次启动eureka-server、confg-cserver,启动两个config-client,端口为:8881、8882。

访问http://localhost:8881/hi 或者http://localhost:8882/hi浏览器显示:foo version 3

这时我们去代码仓库将foo的值改为“foo version 4”,即改变配置文件foo的值。如果是传统的做法,需要重启服务,才能达到配置文件的更新。此时,我们只需要发送post请求:http://localhost:8881/actuator/bus-refresh,你会发现config-client会重新读取配置文件

这时我们再访问http://localhost:8881/hi或者http://localhost:8882/hi 浏览器显示:foo version 4

另外,/bus/refresh接口可以指定服务,即使用”destination”参数,比如 “/bus/refresh?destination=customers:**” 即刷新服务名为customers的所有服务,不管ip。

]]>
spring cloud微服务分布式云架构-Spring Cloud Config环境库 http://blog.okbase.net/iteye01/archive/56227.html iteye01 2019/3/14 15:51:13 您要在哪里存储配置服务器的配置数据?管理此行为的策略是EnvironmentRepository,服务于Environment对象。此Environment是Spring Environment(包括propertySources作为主要功能)的域的浅层副本。Environment资源由三个变量参数化:Spring Cloud大型企业分布式微服务云架构源码请加一七九一七四三三八零

{application}映射到客户端的“spring. application .name”;

{profile}映射到客户端上的“spring.profiles.active”(逗号分隔列表); 和

{label}这是一个服务器端功能,标记“版本”的配置文件集。

存储库实现通常表现得像一个Spring Boot应用程序从“spring .config. name”等于{application}参数加载配置文件,“spring.profiles.active”等于{profiles}参数。配置文件的优先级规则也与常规启动应用程序相同:活动配置文件优先于默认配置,如果有多个配置文件,则最后一个获胜(例如向Map添加条目)。

示例:客户端应用程序具有此引导配置:


spring:
  application:
    name: foo
  profiles:
    active: dev,mysql


(通常使用Spring Boot应用程序,这些属性也可以设置为环境变量或命令行参数)。

如果存储库是基于文件的,则服务器将从application.yml创建Environment(在所有客户端之间共享),foo.yml(以foo.yml优先))。如果YAML文件中有文件指向Spring配置文件,那么应用的优先级更高(按照列出的配置文件的顺序),并且如果存在特定于配置文件的YAML(或属性)文件,那么这些文件也应用于优先级高于默认值。较高优先级转换为Environment之前列出的PropertySource。(这些规则与独立的Spring Boot应用程序相同。)

]]>
spring cloud微服务分布式云架构-Commons 普通抽象 http://blog.okbase.net/iteye01/archive/56226.html iteye01 2019/3/14 15:50:49

负载平衡和断路器之类的模式适用于所有Spring Cloud客户端可以独立于实现(例如通过Eureka或Consul发现)的消耗的共同抽象层。Spring Cloud大型企业分布式微服务云架构源码请加一七九一七四三三八零

 @EnableDiscoveryClient

Commons提供`@EnableDiscoveryClient`注释。这通过`META-INF/spring.factories`查找`DiscoveryClient`接口的实现。Discovery Client的实现将在`org.springframework.cloud.client.discovery.EnableDiscoveryClient`键下的`spring.factories`中添加一个配置类。`DiscoveryClient`实现的示例是Spring Cloud Netflix Eureka,Spring Cloud Consul发现和Spring Cloud Zookeeper发现

默认情况下,`DiscoveryClient`的实现将使用远程发现服务器自动注册本地Spring Boot服务器。可以通过在`@EnableDiscoveryClient`中设置`autoRegister=false`来禁用此功能。

 ServiceRegistry

Commons现在提供了一个`ServiceRegistry`接口,它提供了诸如`register(Registration)`和`deregister(Registration)`之类的方法,允许您提供定制的注册服务。`Registration`是一个标记界面。

 
@Configuration
@EnableDiscoveryClient(autoRegister=false)
public class MyConfiguration {
    private ServiceRegistry registry;
 
    public MyConfiguration(ServiceRegistry registry) {
        this.registry = registry;
    }
 
    // called via some external process, such as an event or a custom actuator endpoint
    public void register() {
        Registration registration = constructRegistration();
        this.registry.register(registration);
    }
}
 
每个ServiceRegistry实现都有自己的Registry实现。

服务部门自动注册。

默认情况下,ServiceRegistry实现将自动注册正在运行的服务。要禁用该行为,有两种方法。您可以设置@EnableDiscoveryClient(autoRegister=false)永久禁用自动注册。您还可以设置spring.cloud.service-registry.auto-registration.enabled=false以通过配置禁用该行为。

服务注册执行器端点

Commons提供/service-registry致动器端点。该端点依赖于Spring应用程序上下文中的Registration bean。通过GET调用/service-registry/instance-status将返回Registration的状态。具有String主体的同一端点的POST将将当前Registration的状态更改为新值。

 
]]>
spring cloud微服务分布式云架构-服务网关过滤器 http://blog.okbase.net/iteye01/archive/56225.html iteye01 2019/3/14 15:49:50 过滤器作用

我们的微服务应用提供的接口就可以通过统一的API网关入口被客户端访问到了。但是,每个客户端用户请求微服务应用提供的接口时,它们的访问权限往往都需要有一定的限制,系统并不会将所有的微服务接口都对它们开放。然而,目前的服务路由并没有限制权限这样的功能,所有请求都会被毫无保留地转发到具体的应用并返回结果,为了实现对客户端请求的安全校验和权限控制,最简单和粗暴的方法就是为每个微服务应用都实现一套用于校验签名和鉴别权限的过滤器或拦截器。Spring Cloud大型企业分布式微服务云架构源码请加一七九一七四三三八零

不过,这样的做法并不可取,它会增加日后的系统维护难度,因为同一个系统中的各种校验逻辑很多情况下都是大致相同或类似的,这样的实现方式会使得相似的校验逻辑代码被分散到了各个微服务中去,冗余代码的出现是我们不希望看到的。所以,比较好的做法是将这些校验逻辑剥离出去,构建出一个独立的鉴权服务。在完成了剥离之后,有不少开发者会直接在微服务应用中通过调用鉴权服务来实现校验,但是这样的做法仅仅只是解决了鉴权逻辑的分离,并没有在本质上将这部分不属于业余的逻辑拆分出原有的微服务应用,冗余的拦截器或过滤器依然会存在。

对于这样的问题,更好的做法是通过前置的网关服务来完成这些非业务性质的校验。由于网关服务的加入,外部客户端访问我们的系统已经有了统一入口,既然这些校验与具体业务无关,那何不在请求到达的时候就完成校验和过滤,而不是转发后再过滤而导致更长的请求延迟。同时,通过在网关中完成校验和过滤,微服务应用端就可以去除各种复杂的过滤器和拦截器了,这使得微服务应用的接口开发和测试复杂度也得到了相应的降低。

为了在API网关中实现对客户端请求的校验,我们将需要使用到Spring Cloud Zuul的另外一个核心功能:过滤器。

Zuul允许开发者在API网关上通过定义过滤器来实现对请求的拦截与过滤,实现的方法非常简单,我们只需要继承ZuulFilter抽象类并实现它定义的四个抽象函数就可以完成对请求的拦截和过滤了。

 过滤器的实现

比如下面的代码,我们定义了一个简单的Zuul过滤器,它实现了在请求被路由之前检查HttpServletRequest中是否有accessToken参数,若有就进行路由,若没有就拒绝访问,返回401 Unauthorized错误。
 
public class AccessFilter extends ZuulFilter {
 
private static Logger log = LoggerFactory.getLogger(AccessFilter.class);
 
@Override
 
public String filterType() {
 
return "pre";
 
}
 
@Override
 
public int filterOrder() {
 
return 0;
 
}
 
@Override
 
public boolean shouldFilter() {
 
return true;
 
}
 
@Override
 
public Object run() {
 
RequestContext ctx = RequestContext.getCurrentContext();
 
HttpServletRequest request = ctx.getRequest();
 
log.info("send {} request to {}", request.getMethod(), request.getRequestURL().toString());
 
Object accessToken = request.getParameter("accessToken");
 
if(accessToken == null) {
 
log.warn("access token is empty");
 
ctx.setSendZuulResponse(false);
 
ctx.setResponseStatusCode(401);
 
return null;
 
}
 
log.info("access token ok");
 
return null;
 
}
 
}
 
在上面实现的过滤器代码中,我们通过继承ZuulFilter抽象类并重写了下面的四个方法来实现自定义的过滤器。这四个方法分别定义了:

filterType:过滤器的类型,它决定过滤器在请求的哪个生命周期中执行。这里定义为pre,代表会在请求被路由之前执行。

filterOrder:过滤器的执行顺序。当请求在一个阶段中存在多个过滤器时,需要根据该方法返回的值来依次执行。

shouldFilter:判断该过滤器是否需要被执行。这里我们直接返回了true,因此该过滤器对所有请求都会生效。实际运用中我们可以利用该函数来指定过滤器的有效范围。

run:过滤器的具体逻辑。这里我们通过ctx.setSendZuulResponse(false)令zuul过滤该请求,不对其进行路由,然后通过ctx.setResponseStatusCode(401)设置了其返回的错误码,当然我们也可以进一步优化我们的返回,比如,通过ctx.setResponseBody(body)对返回body内容进行编辑等。

在实现了自定义过滤器之后,它并不会直接生效,我们还需要为其创建具体的Bean才能启动该过滤器,比如,在应用主类中增加如下内容:


 
@EnableZuulProxy
 
@SpringCloudApplication
 
public class Application {
 
public static void main(String[] args) {
 
new SpringApplicationBuilder(Application.class).web(true).run(args);
 
}
 
@Bean
 
public AccessFilter accessFilter() {
 
return new AccessFilter();
 
}
 
}
 
到这里,对于Spring Cloud Zuul过滤器的基本功能就以介绍完毕。读者可以根据自己的需要在服务网关上定义一些与业务无关的通用逻辑实现对请求的过滤和拦截,比如:签名校验、权限校验、请求限流等功能。

从现在开始,我这边会将近期研发的springcloud微服务云架构的搭建过程和精髓记录下来,帮助更多有兴趣研发spring cloud框架的朋友,希望可以帮助更多的好学者。大家来一起探讨spring cloud架构的搭建过程及如何运用于企业项目。

]]>
spring cloud微服务分布式云架构-集成项目简介 http://blog.okbase.net/iteye01/archive/56223.html iteye01 2019/3/13 14:25:37

Spring Cloud集成项目有很多,下面我们列举一下和Spring Cloud相关的优秀项目,我们的企业架构中用到了很多的优秀项目,说白了,也是站在巨人的肩膀上去整合的。在学习Spring Cloud之前大家必须了解一下相关项目,希望可以帮助到大家。Spring Cloud大型企业分布式微服务云架构源码请加一七九一七四三三八零

Spring Cloud Config

配置管理工具包,让你可以把配置放到远程服务器,集中化管理集群配置,目前支持本地存储、Git以及Subversion。

Spring Cloud Bus

​事件、消息总线,用于在集群(例如,配置变化事件)中传播状态变化,可与Spring Cloud Config联合实现热部署。

Eureka

云端服务发现,一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移。

Hystrix

熔断器,容错管理工具,旨在通过熔断机制控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。

Zuul

Zuul 是在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门。

Archaius

配置管理API,包含一系列配置管理API,提供动态类型化属性、线程安全配置操作、轮询框架、回调机制等功能。

Consul

封装了Consul操作,consul是一个服务发现与配置工具,与Docker容器可以无缝集成。

Spring Cloud for Cloud Foundry

通过Oauth2协议绑定服务到CloudFoundry,CloudFoundry是VMware推出的开源PaaS云平台。

Spring Cloud Sleuth

日志收集工具包,封装了Dapper和log-based追踪以及Zipkin和HTrace操作,为SpringCloud应用实现了一种分布式追踪解决方案。

Spring Cloud Data Flow

大数据操作工具,作为Spring XD的替代产品,它是一个混合计算模型,结合了流数据与批量数据的处理方式。

Spring Cloud Security

基于spring security的安全工具包,为你的应用程序添加安全控制。

Spring Cloud Zookeeper

操作Zookeeper的工具包,用于使用zookeeper方式的服务发现和配置管理。

Spring Cloud Stream

数据流操作开发包,封装了与Redis,Rabbit、Kafka等发送接收消息。

Spring Cloud CLI

基于 Spring Boot CLI,可以让你以命令行方式快速建立云组件。

Ribbon

提供云端负载均衡,有多种负载均衡策略可供选择,可配合服务发现和断路器使用。

Turbine

Turbine是聚合服务器发送事件流数据的一个工具,用来监控集群下hystrix的metrics情况。

Feign

Feign是一种声明式、模板化的HTTP客户端。

Spring Cloud Task

提供云端计划任务管理、任务调度。

Spring Cloud Connectors

便于云端应用程序在各种PaaS平台连接到后端,如:数据库和消息代理服务。

Spring Cloud Cluster

提供Leadership选举,如:Zookeeper, Redis, Hazelcast, Consul等常见状态模式的抽象和实现。

Spring Cloud Starters

Spring Boot式的启动项目,为Spring Cloud提供开箱即用的依赖管理。

 
]]>
spring cloud微服务分布式云架构-eureka 基础 http://blog.okbase.net/iteye01/archive/56222.html iteye01 2019/3/13 14:25:05

在构建项目之前,我们先学习一下eureka,这是官方的讲解,我这边再重新帮大家回顾一下:

服务发现:Eureka客户端  Spring Cloud大型企业分布式微服务云架构源码请加一七九一七四三三八零

服务发现是基于微服务架构的关键原则之一。尝试配置每个客户端或某种形式的约定可能非常困难,可以非常脆弱。Netflix服务发现服务器和客户端是Eureka。可以将服务器配置和部署为高可用性,每个服务器将注册服务的状态复制到其他服务器。

如何包含Eureka客户端

要在您的项目中包含Eureka客户端,请使用组org.springframework.cloud和工件ID spring-cloud-starter-eureka的启动器。

注册Eureka

当客户端注册Eureka时,它提供关于自身的元数据,例如主机和端口,健康指示符URL,主页等。Eureka从属于服务的每个实例接收心跳消息。如果心跳失败超过可配置的时间表,则通常将该实例从注册表中删除。

示例eureka客户端:
 
@Configuration
@ComponentScan
@EnableAutoConfiguration
@EnableEurekaClient
@RestController
public class Application {
 
    @RequestMapping("/")
    public String home() {
        return "Hello world";
    }
 
    public static void main(String[] args) {
        new SpringApplicationBuilder(Application.class).web(true).run(args);
    }
 
}
 
(即完全正常的Spring Boot应用程序)。在这个例子中,我们明确地使用@EnableEurekaClient,但只有Eureka可用,你也可以使用@EnableDiscoveryClient。需要配置才能找到Eureka服务器。例:
 
application.yml

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
 
其中“defaultZone”是一个魔术字符串后备值,为任何不表示首选项的客户端提供服务URL(即它是有用的默认值)。

从Environment获取的默认应用程序名称(服务ID),虚拟主机和非安全端口分别为${spring. application. name},{spring .application .name}和{server. port}。

@EnableEurekaClient将应用程序同时进入一个Eureka“实例”(即注册自己)和一个“客户端”(即它可以查询注册表以查找其他服务)。实例行为由eureka.instance.*配置键驱动,但是如果您确保您的应用程序具有 spring .application .name(这是Eureka服务ID或VIP的默认值),那么默认值将是正常的。

使用Eureka服务器进行身份验证

如果其中一个eureka.client.serviceUrl.defaultZone网址中包含一个凭据(如http://user:password@localhost:8761/eureka)),HTTP基本身份验证将自动添加到您的eureka客户端。对于更复杂的需求,您可以创建DiscoveryClientOptionalArgs类型的@Bean,并将ClientFilter实例注入到其中,所有这些都将应用于从客户端到服务器的调用。

注意

由于Eureka中的限制,不可能支持每个服务器的基本身份验证凭据,所以只能使用第一个找到的集合。

状态页和健康指标

Eureka实例的状态页面和运行状况指示器分别默认为“/ info”和“/ health”,它们是Spring Boot执行器应用程序中有用端点的默认位置。如果您使用非默认上下文路径或servlet路径(例如server.servletPath=/foo)或管理端点路径(例如management.contextPath=/admin),则需要更改这些,即使是执行器应用程序。例:
 
application.yml
eureka:
  instance:
    statusPageUrlPath: ${management.context-path}/info
    healthCheckUrlPath: ${management.context-path}/health
 
这些链接显示在客户端使用的元数据中,并在某些情况下用于决定是否将请求发送到应用程序,因此如果它们是准确的,这是有帮助的。

注册安全应用程序

如果您的应用程序想通过HTTPS联系,则可以分别在EurekaInstanceConfig,即 eureka.instance.[nonSecurePortEnabled,securePortEnabled]=[false,true] 中设置两个标志。这将使Eureka发布实例信息显示安全通信的明确偏好。Spring Cloud DiscoveryClient将始终为以这种方式配置的服务返回一个https://…​; URI,并且Eureka(本机)实例信息将具有安全的健康检查URL。

由于Eureka内部的工作方式,它仍然会发布状态和主页的非安全网址,除非您也明确地覆盖。您可以使用占位符来配置eureka实例URL,例如
 
application.yml
eureka:
  instance:
    statusPageUrl: https://${eureka.hostname}/info
    healthCheckUrl: https://${eureka.hostname}/health
    homePageUrl: https://${eureka.hostname}/
 
(请注意,{eureka.hostname}是仅在稍后版本的Eureka中可用的本地占位符,您也可以使用Spring占位符实现同样的功能,例如使用{eureka.instance.hostName}。

注意

如果您的应用程序在代理服务器后面运行,并且SSL终止服务在代理中(例如,如果您运行在Cloud Foundry或其他平台作为服务),则需要确保代理“转发”头部被截取并处理应用程序。Spring Boot应用程序中的嵌入式Tomcat容器会自动执行“X-Forwarded - \ *”标头的显式配置。你这个错误的一个迹象就是你的应用程序本身所呈现的链接是错误的(错误的主机,端口或协议)。

Eureka的健康检查

默认情况下,Eureka使用客户端心跳来确定客户端是否启动。除非另有规定,否则发现客户端将不会根据Spring Boot执行器传播应用程序的当前运行状况检查状态。这意味着成功注册后Eureka将永远宣布申请处于“UP”状态。通过启用Eureka运行状况检查可以改变此行为,从而将应用程序状态传播到Eureka。因此,每个其他应用程序将不会在“UP”之外的状态下将流量发送到应用程序。
 
application.yml
eureka:
  client:
    healthcheck:
      enabled: true
 
警告

eureka.client.healthcheck.enabled=true只能在application.yml中设置。设置bootstrap.yml中的值将导致不期望的副作用,例如在具有UNKNOWN状态的eureka中注册。

如果您需要更多的控制健康检查,您可以考虑实施自己的com.netflix.appinfo.HealthCheckHandler。

Eureka实例和客户端的元数据

值得花点时间了解Eureka元数据的工作原理,以便您可以在平台上使用它。有主机名,IP地址,端口号,状态页和运行状况检查等标准元数据。这些发布在服务注册表中,由客户使用,以直接的方式联系服务。额外的元数据可以添加到eureka.instance.metadataMap中的实例注册中,并且这将在远程客户端中可访问,但一般不会更改客户端的行为,除非意识到元数据的含义。下面描述了几个特殊情况,其中Spring Cloud已经为元数据映射指定了含义。

在Cloudfoundry上使用Eureka

Cloudfoundry有一个全局路由器,所以同一个应用程序的所有实例都具有相同的主机名(在具有相似架构的其他PaaS解决方案中也是如此)。这不一定是使用Eureka的障碍,但如果您使用路由器(建议,甚至是强制性的,具体取决于您的平台的设置方式),则需要明确设置主机名和端口号(安全或非安全),以便他们使用路由器。您可能还需要使用实例元数据,以便您可以区分客户端上的实例(例如,在自定义负载平衡器中)。默认情况下,eureka.instance.instanceId为vcap.application.instance_id。例如:
 
application.yml
eureka:
  instance:
    hostname: ${vcap.application.uris[0]}
    nonSecurePort: 80

服务发现:Eureka服务器

如何包含Eureka服务器

要在项目中包含Eureka服务器,请使用组org.springframework.cloud和工件id spring-cloud-starter-eureka-server的启动器。有关 使用当前的Spring Cloud发布列表设置构建系统的详细信息,请参阅Spring Cloud项目页面。

如何运行Eureka服务器

示例eureka服务器;

@SpringBootApplication
@EnableEurekaServer
public class Application {

    public static void main(String[] args) {
        new SpringApplicationBuilder(Application.class).web(true).run(args);
    }

}

其他的我就不多讲了,还有很多关于注册中心的讲解,大家可以去查一下相关的资料。

从现在开始,我这边会将近期研发的spring cloud微服务云架构的搭建过程和精髓记录下来,帮助更多有兴趣研发spring cloud框架的朋友,大家来一起探讨spring cloud架构的搭建过程及如何运用于企业项目。

 
]]>
spring cloud微服务分布式云架构-commonservice-config配置服务搭建 http://blog.okbase.net/iteye01/archive/56221.html iteye01 2019/3/13 14:23:48 1. 介绍

 

Spring Cloud Config为分布式系统中的外部配置提供服务器和客户端支持。使用Config Server,您可以在所有环境中管理应用程序的外部属性。客户端和服务器上的概念映射与Spring Environment和PropertySource抽象相同,因此它们与Spring应用程序非常契合,但可以与任何以任何语言运行的应用程序一起使用。随着应用程序通过从开发人员到测试和生产的部署流程,您可以管理这些环境之间的配置,并确定应用程序具有迁移时需要运行的一切。服务器存储后端的默认实现使用git,因此它轻松支持标签版本的配置环境,以及可以访问用于管理内容的各种工具。很容易添加替代实现,并使用Spring配置将其插入。Spring Cloud大型企业分布式微服务云架构源码请加一七九一七四三三八零

 

2. 引入pom相关jar包,其中pom.xml配置如下:
 

<?xml version="1.0" encoding="UTF-8"?>  
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
    <modelVersion>4.0.0</modelVersion>  
  
    <parent>  
        <groupId>com.ml.honghu</groupId>  
        <artifactId>commonservice</artifactId>  
        <version>0.0.1-SNAPSHOT</version>  
    </parent>  
      
    <artifactId>commonservice-config</artifactId>  
    <packaging>jar</packaging>  
  
    <name>commonservice-config</name>  
    <description>Config Server</description>  
  
    <dependencies>  
        <dependency>  
            <groupId>org.springframework.cloud</groupId>  
            <artifactId>spring-cloud-config-server</artifactId>  
        </dependency>  
        <dependency>  
            <groupId>org.springframework.cloud</groupId>  
            <artifactId>spring-cloud-starter-eureka</artifactId>  
        </dependency>  
        <dependency>  
                    <groupId>org.springframework.boot</groupId>  
                    <artifactId>spring-boot-starter-security</artifactId>  
            </dependency>  
        <dependency>  
            <groupId>org.springframework.boot</groupId>  
            <artifactId>spring-boot-starter-test</artifactId>  
            <scope>test</scope>  
        </dependency>  
    </dependencies>  
  
    <build>  
        <plugins>  
            <plugin>  
                <groupId>org.springframework.boot</groupId>  
                <artifactId>spring-boot-maven-plugin</artifactId>  
                <executions>  
                    <execution>  
                        <id>1</id>  
                        <goals>  
                            <goal>repackage</goal>  
                        </goals>  
                    </execution>  
                                    <execution>  
                                        <id>2</id>  
                                            <goals>  
                                                   <goal>build-info</goal>  
                                            </goals>  
                                    </execution>  
                </executions>  
            </plugin>  
        </plugins>  
    </build>  
</project>  


 
3. 在src/main/java进行ConfigApplication.java启动文件配置:
 

package com.ml.honghu;  
  
import org.springframework.boot.SpringApplication;  
import org.springframework.boot.autoconfigure.SpringBootApplication;  
import org.springframework.cloud.config.server.EnableConfigServer;  
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;  
  
@EnableConfigServer  
@EnableEurekaClient  
@SpringBootApplication  
public class ConfigApplication {  
  
    public static void main(String[] args) {  
        SpringApplication.run(ConfigApplication.class, args);  
    }  
}  


 
4. 在src/main/resource下进行bootstrap.yml配置
 

server:   
port: 8888  
spring:  
  application:  
    name: commonservice-config-server  
  profiles:  
    active: discovery,native  
  cloud:  
    config:  
      server:  
        git:  
          uri: http://192.168.0.254/honghu.../honghu-config.git  
          username: honghu  
          password: 123456  
          searchPaths: config-dev  
security:  
  basic:  
    enabled: true  
  user:  
    name: honghu  
    password: 123456  
eureka:  
  client:  
    serviceUrl:  
      defaultZone: http://honghu:123456@localhost:8761/eureka/  
      honghuZone: http://honghu:123456@localhost:8761/eureka/  
    registry-fetch-interval-seconds: 300  
    availability-zones:  
      honghu: honghuZone  
  instance:  
    prefer-ip-address: true  
    metadataMap:  
      version: 1.0  
      variant: A  
      user: ${security.user.name}  
      password: ${security.user.password}  
management:  
  security:  
    enabled: false  


 
注意: 如果不从远程git或者svn库加载配置文件信息,可以配置加载本地地址,比如window下配置使用:

server:   
port: 8888  
spring:  
  application:  
    name: commonservice-config-server  
  profiles:  
    active: discovery,native  
  cloud:  
    config:  
      server:  
        <span style="color: #ff0000;">native.searchLocations: d:/honghu-config</span>  
security:  
  basic:  
    enabled: true  
  user:  
    name: honghu  
    password: 123456  
eureka:  
  client:  
    serviceUrl:  
      defaultZone: http://honghu:123456@localhost:8761/eureka/  
      honghuZone: http://honghu:123456@localhost:8761/eureka/  
    registry-fetch-interval-seconds: 300  
    availability-zones:  
      honghu: honghuZone  
  instance:  
    prefer-ip-address: true  
    metadataMap:  
      version: 1.0  
      variant: A  
      user: ${security.user.name}  
      password: ${security.user.password}  
management:  
  security:  
    enabled: false  


 
到此,整个config服务项目配置完毕!

]]>
spring cloud微服务分布式云架构-服务注册与发现(Eureka、Consul) http://blog.okbase.net/iteye01/archive/56220.html iteye01 2019/3/13 14:22:11 Spring Cloud简介

Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一种简单的开发方式。Spring Cloud大型企业分布式微服务云架构源码请加一七九一七四三三八零

 

Spring Cloud包含了多个子项目(针对分布式系统中涉及的多个不同开源产品),比如:Spring Cloud Config、Spring Cloud Netflix、Spring Cloud0 CloudFoundry、Spring Cloud AWS、Spring Cloud Security、Spring Cloud Commons、Spring Cloud Zookeeper、Spring Cloud CLI等项目。

 

微服务架构

 

“微服务架构”在这几年非常的火热,以至于关于微服务架构相关的开源产品被反复的提及(比如:netflix、dubbo),Spring Cloud也因Spring社区的强大知名度和影响力也被广大架构师与开发者备受关注。

 

那么什么是“微服务架构”呢?简单的说,微服务架构就是将一个完整的应用从数据存储开始垂直拆分成多个不同的服务,每个服务都能独立部署、独立维护、独立扩展,服务与服务间通过诸如RESTful API的方式互相调用。

 

对于“微服务架构”,大家在互联网可以搜索到很多相关的介绍和研究文章来进行学习和了解。也可以阅读始祖Martin Fowler的《Microservices》(中文版翻译点击查看),本文不做更多的介绍和描述。

 

服务治理

 

在简单介绍了Spring Cloud和微服务架构之后,下面回归本文的主旨内容,如何使用Spring Cloud来实现服务治理。

由于Spring Cloud为服务治理做了一层抽象接口,所以在Spring Cloud应用中可以支持多种不同的服务治理框架,比如:Netflix Eureka、Consul、Zookeeper。在Spring Cloud服务治理抽象层的作用下,我们可以无缝地切换服务治理实现,并且不影响任何其他的服务注册、服务发现、服务调用等逻辑。

 

所以,下面我们通过介绍两种服务治理的实现来体会Spring Cloud这一层抽象所带来的好处。

 

Spring Cloud Eureka

 

首先,我们来尝试使用Spring Cloud Eureka来实现服务治理。

 

Spring Cloud Eureka是Spring Cloud Netflix项目下的服务治理模块。而Spring Cloud Netflix项目是Spring Cloud的子项目之一,主要内容是对Netflix公司一系列开源产品的包装,它为Spring Boot应用提供了自配置的Netflix OSS整合。通过一些简单的注解,开发者就可以快速的在应用中配置一下常用模块并构建庞大的分布式系统。它主要提供的模块包括:服务发现(Eureka),断路器(Hystrix),智能路由(Zuul),客户端负载均衡(Ribbon)等。

 

下面,就来具体看看如何使用Spring Cloud Eureka实现服务治理。

 

创建“服务注册中心”

 

创建一个基础的Spring Boot工程,命名为eureka-server,并在pom.xml中引入需要的依赖内容:
 

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.4.RELEASE</version>
    <relativePath/>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka-server</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-dependencies</artifactId>
           <version>Dalston.SR1</version>
           <type>pom</type>
           <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>


通过@EnableEurekaServer注解启动一个服务注册中心提供给其他应用进行对话。这一步非常的简单,只需要在一个普通的Spring Boot应用中添加这个注解就能开启此功能,比如下面的例子:
 

@EnableEurekaServer
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        new SpringApplicationBuilder(Application.class)
                    .web(true).run(args);
    }
}
 

在默认设置下,该服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为,只需要在application.properties配置文件中增加如下信息:
 

spring.application.name=eureka-server
server.port=1001

eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

 
为了与后续要进行注册的服务区分,这里将服务注册中心的端口通过server.port属性设置为1001。启动工程后,访问:http:/ /localhost:1001/,可以看到下面的页面,其中还没有发现任何服务。

]]>
(十三)spring cloud微服务分布式云架构-服务容错保护(Hystrix断路器) http://blog.okbase.net/iteye01/archive/56219.html iteye01 2019/3/13 14:20:24 断路器


断路器模式源于Martin Fowler的Circuit Breaker一文。“断路器”本身是一种开关装置,用于在电路上保护线路过载,当线路中有电器发生短路时,“断路器”能够及时的切断故障电路,防止发生过载、发热、甚至起火等严重后果。Spring Cloud大型企业分布式微服务云架构源码请加一七九一七四三三八零

 

在分布式架构中,断路器模式的作用也是类似的,当某个服务单元发生故障(类似用电器发生短路)之后,通过断路器的故障监控(类似熔断保险丝),直接切断原来的主逻辑调用。但是,在Hystrix中的断路器除了切断主逻辑的功能之外,还有更复杂的逻辑,下面我们来看看它更为深层次的处理逻辑。

 

以在《Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)》一文中实现的服务降级例子为示例,我们来说说断路器的工作原理。当我们把服务提供者eureka-client中加入了模拟的时间延迟之后,在服务消费端的服务降级逻辑因为hystrix命令调用依赖服务超时,触发了降级逻辑,但是即使这样,受限于Hystrix超时时间的问题,我们的调用依然很有可能产生堆积。

这个时候断路器就会发挥作用,那么断路器是在什么情况下开始起作用呢?这里涉及到断路器的三个重要参数:快照时间窗、请求总数下限、错误百分比下限。这个参数的作用分别是:

 

快照时间窗:断路器确定是否打开需要统计一些请求和错误数据,而统计的时间范围就是快照时间窗,默认为最近的10秒。


请求总数下限:在快照时间窗内,必须满足请求总数下限才有资格根据熔断。默认为20,意味着在10秒内,如果该hystrix命令的调用此时不足20次,即时所有的请求都超时或其他原因失败,断路器都不会打开。

 

错误百分比下限:当请求总数在快照时间窗内超过了下限,比如发生了30次调用,如果在这30次调用中,有16次发生了超时异常,也就是超过50%的错误百分比,在默认设定50%下限情况下,这时候就会将断路器打开。

 

那么当断路器打开之后会发生什么呢?我们先来说说断路器未打开之前,对于之前那个示例的情况就是每个请求都会在当hystrix超时之后返回fallback,每个请求时间延迟就是近似hystrix的超时时间,如果设置为5秒,那么每个请求就都要延迟5秒才会返回。当熔断器在10秒内发现请求总数超过20,并且错误百分比超过50%,这个时候熔断器打开。打开之后,再有请求调用的时候,将不会调用主逻辑,而是直接调用降级逻辑,这个时候就不会等待5秒之后才返回fallback。通过断路器,实现了自动地发现错误并将降级逻辑切换为主逻辑,减少响应延迟的效果。

 

在断路器打开之后,处理逻辑并没有结束,我们的降级逻辑已经被成了主逻辑,那么原来的主逻辑要如何恢复呢?对于这一问题,hystrix也为我们实现了自动恢复功能。当断路器打开,对主逻辑进行熔断之后,hystrix会启动一个休眠时间窗,在这个时间窗内,降级逻辑是临时的成为主逻辑,当休眠时间窗到期,断路器将进入半开状态,释放一次请求到原来的主逻辑上,如果此次请求正常返回,那么断路器将继续闭合,主逻辑恢复,如果这次请求依然有问题,断路器继续进入打开状态,休眠时间窗重新计时。

 

通过上面的一系列机制,hystrix的断路器实现了对依赖资源故障的端口、对降级策略的自动切换以及对主逻辑的自动恢复机制。这使得我们的微服务在依赖外部服务或资源的时候得到了非常好的保护,同时对于一些具备降级逻辑的业务需求可以实现自动化的切换与恢复,相比于设置开关由监控和运维来进行切换的传统实现方式显得更为智能和高效。

]]>