springCloud进阶(微服务架构&Eureka)

springCloud进阶(微服务架构&Eureka)

1. 微服务集群

1.1 为什么要集群

为了提供并发量,有时同一个服务提供者可以部署多个(商品服务)。这个客户端在调用时要根据一定的负责均衡策略完成负载调用。

1.2 服务提供者集群-同一种服务(服务名)部署多个

实际生产就是同一种服务多部署几台服务器,开发时就是用端口来区分。

1) 拷贝一份8001

2) 修改主类-改名

3) 改8002yml,端口

4) 服务提供者

1.3 服务消费者负载均衡调用

1)常见的负载均衡技术

Ribbon feign

2)常见的负载均衡

轮休

可用性检查

权重


内置负载均衡规则类


规则描述


RoundRobinRule(默认)


简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。


AvailabilityFilteringRule


对以下两种服务器进行忽略:

(1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为“短路”状态。短路状态将持续30秒,如果再次连接失败,短路的持续时间就会几何级地增加。

注意:可以通过修改配置loadbalancer.<clientName>.connectionFailureCountThreshold来修改连接失败多少次之后被设置为短路状态。默认是3次。

(2)并发数过高的服务器。如果一个服务器的并发连接数过高,配置了AvailabilityFilteringRule规则的客户端也会将其忽略。并发连接数的上线,可以由客户端的<clientName>.<clientConfigNameSpace>.ActiveConnectionsLimit属性进行配置。


WeightedResponseTimeRule


为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。


ZoneAvoidanceRule


以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。


BestAvailableRule


忽略哪些短路的服务器,并选择并发数较低的服务器。


RandomRule


随机选择一个可用的服务器。


Retry


重试机制的选择逻辑

3)ribbon

a. 配置层添加@LoadBAlanced注解

/**
 * RestTemplate调用远程接口
 * @author Lenovo
 */
@Configuration
public class BaseConfig {
    @Bean
    @LoadBalanced   //开启负载均衡
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

b. controller层代码

@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private RestTemplate restTemplate;

    /**
     * 通过服务名完成调用
     */
    private final String URL_PREFIX = "http://PRODUCT-SERVICE/product/";

    /**
     * 暴露通过id远程查询product的接口
     * @param id
     * @return
     */
    @GetMapping("/product/{id}")
    public Product getProductById(@PathVariable("id") Long id){
        /**
         * 缺点:要拼接的地址很长
         */
        String url = URL_PREFIX + id;
        //以接口的方式进行调用
        return restTemplate.getForObject(url,Product.class);
    }
}

controller层代码

2) feign

a. 主类配置扫描client

/**
 * 如果你的client就在该类的子子孙孙包,否则必须指定包名
 * 加了它以后,就会扫描加了@FeignClient这个注解的接口,并且为这些接口产生代理对象
 *  并且把这些代理对象纳入spring管理,我们要使用时直接获取就可以完成远程调用
 *
 */
@EnableFeignClients

b. client代码

@FeignClient(value = "PRODUCT-SERVICE")    //里面所有的方法都要调用PRODUCT-SERVCIE这个服务
@RequestMapping("/product")
public interface ProductClient {
    /**
     * 回掉托底
     */
    @GetMapping("/{id}")
    public Product getProductById(@PathVariable(name = "id") Long id);
}

ProductClient

c. controller层代码。(注解注入client调用接口)

@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private ProductClient productClient;

    /**
     * 暴露通过id远程查询product的接口
     * @param id
     * @return
     */
    @GetMapping("/product/{id}")
    public Product getProductById(@PathVariable("id") Long id){
        return productClient.getProductById(id);
    }
}

OrderController

2. hystrix断路器

2.1 hystrix是什么

微服务架构储器服务健壮的框架

2.2 hystrix作用

解决微服务架构的雪崩现象

2.3 hystrix解决雪崩的措施

资源隔离(限流):包括线程池隔离和信号量隔离,限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其他服务调用。

熔断:当失败率达到阀值自动触发降级(如因网络故障/超时造成的失败率高),熔断器触发的快速失败会进行快速恢复。

降级机制:超时降级、资源不足时(线程或信号量)降级,降级后可以配合降级接口返回托底数据。

缓存:提供了请求缓存、请求合并实现。

2.4 配置hystrix

1)导入依赖

<!--断路器-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>

2)主类添加@EnableHystrix注解

@EnableHystrix  //开启hystrix 熔断和降级才会生效

3)controller层代码

@RestController
@RequestMapping("/product")
public class ProductController {
    @Autowired
    private ProductService productService;

    /**
     * 根据id查询单条数据
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    @HystrixCommand(fallbackMethod = "findOneFallback")
    public Product findOne(@PathVariable(name = "id") Long id) {
        //如果传入的id=2,报一个错让他熔断,其他的正常访问
        if (id.intValue() == 2){
            throw  new RuntimeException("报错了!");
        }
        Product product = productService.findOne(id);
        //为了查看是那个服务(端口运行得)
        product.setName(product.getName() + "-8003");
        return product;
    }

    private Product findOneFallback(Long id) {
        return new Product(id, "已经熔断啦...");
    }
}

ProductController

2.5 feign

feign熔断机制是封装hystrix

1)托底关键代码

/**
 * 这个工程类要给我们配一个ProductClient的托底类
 * @author Lenovo
 */
@Component
public class ProductClientFallbackFactory implements FallbackFactory<ProductClient> {

    /**
     * 里面就是返回托底类,里面要为每个方法都有一个托底方法
     * @param throwable
     * @return
     */
    @Override
    public ProductClient create(Throwable throwable) {
        return new ProductClient() {
            @Override
            public Product getProductById(Long id) {
                return new Product(id, "feign的托底方法");
            }
        };
    }
}

ProductClientFallbackFactory

2)修改[email protected]注释

指定托底方法

@FeignClient(value = "PRODUCT-SERVICE", fallbackFactory = ProductClientFallbackFactory.class)

3. zuul路由网关

3.1 zuul路由网关是什么

为外部访问提供统一的入口,并且我们可以通过过滤完成过度,并且封装负载均衡ribbon,封装了熔断hystrix

3.2 实现zuul路由网关

1)基本配置

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</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-netflix-zuul</artifactId>
</dependency>

yml配置

server:
  port: 4399
spring:
  application:
    name: ZUUL-GATEWAY
eureka:
  client:
    service-url:
      defaultZone: http://eureka-7001.com:7001/eureka, http://eureka-7002.com:7002/eureka
  instance:
    instance-id: gateway-4399.com
    prefer-ip-address: false

主类添加@EnableZuulProxy注解

@EnableZuulProxy    //启用zuul代理

2)路由访问加固(不用服务名,映射路径)

zuul:
  routes:
    myUser.serviceId: product-service # 服务名
    myUser.path: /dyier/** # dyier打头的所有请求都转发给product-service服务
  ignored-services: "*" #所有服务都不允许以服务名来访问
  prefix: "/services" #加一个统一前缀

3)拦截器实现登陆

filter代码

@Component
public class LoginFilter extends ZuulFilter {
    /**
     * 过滤器类型
     * - pre:请求在被路由之前执行
     *   - routing:在路由请求时调用
     *   - post:在routing和errror过滤器之后调用
     *   - error:处理请求时发生错误调用
     * @return
     */
    @Override
    public String filterType() {
        return "pre";
    }

    /**
     * 设置优先级,值越小越优先
     * @return
     */
    @Override
    public int filterOrder() {
        return 1;
    }

    /**
     * 是否执行本过滤器
     * @return
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }

    /**
     * 过滤的逻辑
     * @return
     * @throws ZuulException
     */
    @Override
    public Object run() throws ZuulException {
        //获取上下文
        RequestContext currentContext = RequestContext.getCurrentContext();
        //获取请求
        HttpServletRequest request = currentContext.getRequest();
        //从请求头中获取token
        String token = request.getHeader("token");
        //判断是否登陆
        if (null == token || "".equals(token)) {
            //校验失败
            currentContext.setSendZuulResponse(false);
            //返回一个状态码401。也可以重定向
            currentContext.setResponseStatusCode(HttpStatus.SC_UNAUTHORIZED);
        }
        // 校验通过,可以考虑把用户信息放入上下文,继续向后执行
        return null;
    }
}

LoginFilter

4)配置超时管理

zuul:

retryable: true

ribbon:
  ConnectTimeout: 250 # 连接超时时间(ms)
  ReadTimeout: 2000 # 通信超时时间(ms)
  OkToRetryOnAllOperations: true # 是否对所有操作重试
  MaxAutoRetriesNextServer: 2 # 同一服务不同实例的重试次数
  MaxAutoRetries: 1 # 同一实例的重试次数
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMillisecond: 3000 # 熔断超时时长:3000ms

4. springCloud Config分布式配置中心

4.1 为什么需要配置

实现配置文件统一管理(application.yml)

4.2 架构

4.3 实现步骤

1)准备github配置文件

2)configserver(服务端):通过它读取配置文件

application.yml

server:
  port: 1299
eureka:
  client:
    service-url:
      defaultZone: http://eureka-7001.com:7001/eureka,http://eureka-7002.com:7002/eureka # 集群
  instance:
    prefer-ip-address: true
spring:
  application:
    name: SPRING-CLOUD-CONFIG-SERVER
  cloud:
    config:
      server:
        git:
          uri: 仓库地址
          username: 账号
          password: 密码

3)configclient(客户端):真正读取配置文件的地方

bootstrop.yml

spring:
  cloud:
    config:
      name: application-user #github上面名称
      profile: dev #环境
      label: master #分支
      uri: http://127.0.0.1:1299 #配置服务器
eureka:
  client:
    service-url:
      defaultZone: http://eureka-7001.com:7001/eureka, http://eureka-7002.com:7002/eureka # 集群
  instance:
    prefer-ip-address: true #显示客户端真实ip

原文地址:https://www.cnblogs.com/dyier/p/12297302.html

时间: 2024-07-31 12:18:06

springCloud进阶(微服务架构&Eureka)的相关文章

Spring cloud 微服务架构 Eureka篇

1 服务发现 ## 关于服务发现 在微服务架构中,服务发现(Service Discovery)是关键原则之一.手动配置每个客户端或某种形式的约定是很难做的,并且很脆弱.Spring Cloud提供了多种服务发现的实现方式,例如:Eureka.Consul.Zookeeper. Spring Cloud支持得最好的是Eureka,其次是Consul,最次是Zookeeper. 2.创建一个Maven工程(microservice-discovery-eureka),并在pom.xml中加入如下内

关于SpringCloud的微服务架构,提示502 Bad Gateway nginx/1.10.0

1.具体环境是使用虚拟机,并在虚拟机上安装nginx对本机上的端口服务进行反向代理 我按照步骤一步步搭建完环境以后,第一次使用是可以正常使用的,当我关闭计算机后,再一次启动环境,就会发现输入网址之后网页上就会出现这样的问题:“502 Bad Gateway nginx/1.10.0”,经过几天的折磨,发现出现这个问题的根源在与复发链接到网址映射的ip或者是没有找到对应ip下的对应端口,如果你的各种IP映射应用端口都已正常启动运行,但还是提示上述错误,么建议你去检查一下,nginx安装的盘内的/o

微服务架构下 Service Mesh 会是闪亮的明天吗?

7月7日,时速云企业级容器 PaaS 技术沙龙第 10 期在上海成功举办,时速云容器架构负责人魏巍为大家详细讲解了 Service Mesh 中代表性的实践方案.并以 Istio 为例详细讲解了 Service Mesh 中的技术关键点,包括 Istio 控制平面.Istio 数据平面等.以下内容根据魏巍分享整编,希望对大家了解 Service Mesh 有所帮助. 魏巍:大家下午好,刚才几位讲师讲了 K8S 的存储.PaaS 在企业的落地实践等,我们接下来要讲的是企业有了 PaaS 平台.并且

【微服务架构】SpringCloud组件和概念介绍(一)

一:什么是微服务(Microservice) 微服务英文名称Microservice,Microservice架构模式就是将整个Web应用组织为一系列小的Web服务.这些小的Web服务可以独立地编译及部署,并通过各自暴露的API接口相互通讯.它们彼此相互协作,作为一个整体为用户提供功能,却可以独立地进行扩. 微服务架构需要的功能或使用场景 1:我们把整个系统根据业务拆分成几个子系统. 2:每个子系统可以部署多个应用,多个应用之间使用负载均衡. 3:需要一个服务注册中心,所有的服务都在注册中心注册

微服务架构 SpringCloud(一)组件和概念介绍

一:什么是微服务(Microservice) 微服务英文名称Microservice,Microservice架构模式就是将整个Web应用组织为一系列小的Web服务.这些小的Web服务可以独立地编译及部署,并通过各自暴露的API接口相互通讯.它们彼此相互协作,作为一个整体为用户提供功能,却可以独立地进行扩. 微服务架构需要的功能或使用场景 1:我们把整个系统根据业务拆分成几个子系统. 2:每个子系统可以部署多个应用,多个应用之间使用负载均衡. 3:需要一个服务注册中心,所有的服务都在注册中心注册

springcloud微服务实战:Eureka+Zuul+Feign/Ribbon+Hystrix Turbine+SpringConfig+sleuth+zipkin

参考:springcloud微服务实战:Eureka+Zuul+Feign/Ribbon+Hystrix Turbine+SpringConfig+sleuth+zipkin 原创 2017年09月18日 11:46:28 标签: 微服务架构 / 微服务组件 / eureka / ribbon / zuul 26459 springcloud微服务实战:Eureka+Zuul+Feign/Ribbon+Hystrix Turbine+SpringConfig+sleuth+zipkin 相信现在

微服务架构之旅——《走进SpringCloud》

近十年国内互联网行业飞速发展,我们对软件系统的需求已经不再是过去"能用就行"这种很low的档次了,像618.双十一这样的活动 不断逼迫我们去突破软件系统的性能上限,传统的IT企业"能用就行"的开发思想已经不能满足互联网 高并发.大流量的性能要求 .系统架构 走向分布式 已经是服务器开发领域解决该问题唯一的出路,然而分布式系统由于天生的复杂度,并不像开发单体应用一样把框架一堆就能搞定,因此各大互联网公司都在投入技术力量研发自己的基础设施.这里面比较有名的如 阿里的开源

构建SpringBoot,SpringCloud微服务架构分布式电商项目实战

Spring Cloud 微服务总体架构图 上面图中技术名词理解: 1.Sleuth-链路跟踪 为服务之间调用提供链路追踪.通过Sleuth可以很清楚的了解到一个服务请求经过了哪些服务,每个服务处理花费了多长.从而让我们可以很方便的理清各微服务间的调用关系. 2.断路器(Hystrix) 在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用.为了保证其高可用,单个服务通常会集群

JAVA架构师之SpringBoot,SpringCloud构建微服务项目架构

springcloud微服务项目架构搭建第一天(一).项目简介1.准备工作:idea创建springboot模板 2.后台应该涉及的技术(后期可能会有删改) Spring Framework 容器SpringMVC MVC框架Apache Shiro 安全框架Spring session 分布式Session管理MyBatis ORM框架MyBatis Generator 代码生成PageHelper MyBatis物理分页插件Druid 数据库连接池FluentValidator 校验框架Th