精华内容
下载资源
问答
  • SpringCloud五大组件

    千次阅读 多人点赞 2019-12-30 22:53:23
    SpringCloud五大组件 五大组件:Eureka(注册中心), ​ Ribbon/Feign(负载均衡), ​ Zuul(网关), ​ Config(配置中心), ​ Hystrix(熔断器) 注:本文章较长,但是五大组件全都包含 新建一个父模块,导包,...

    SpringCloud五大组件

    五大组件:Eureka(注册中心),

    Ribbon/Feign(负载均衡),

    Zuul(网关),

    Config(配置中心),

    Hystrix(熔断器)

    注:本文章较长,但是五大组件全都包含

    新建一个父模块,导包,包含SpringCloud以及SpringBoot的包

    1.Eureka------注册中心

    ​ 1.1在SpringCloud官网 找到Eureka(How to includ Eureka)

    ​ 1.2新建模块Eureka,导包

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

    ​ 1.3application.yml

    server:
      port: 1000
    eureka:
      instance:
        hostname: localhost #主机
      client:
        registerWithEureka: false #禁止注册中心向自己注册
        fetchRegistry: false #禁止注册中心拉取注册地址清单
        serviceUrl: #微服务向注册中心注册的地址
          defaultZone: http://localhost:1000/eureka/
    
    
    

    1.4在主配置类上打标签 @EnableEurekaServer 开启Eureka事务

    package cn.itsource.springboot;
    
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    
    @SpringBootApplication
    @EnableEurekaServer
    public class EurekaApplication {
    
        public static void main(String[] args) {
            new SpringApplicationBuilder(EurekaApplication.class).web(true).run(args);
        }
    
    }
    

    2.EurekaServer高可用集群

    ​ 2.1为什么使用Eureka高可用集群?

    ​ 答:当只有一个EurekaServer,如果挂掉了,那么整个微服务都不可用,所以要进行集群

    ​ 2.2

    在“我的电脑”C:\Windows\System32\drivers\etc这个路径下 添加两个peer1和peer2
    

    ​ 127.0.0.1 peer1
    ​ 127.0.0.1 peer2

    ​ 2.3 application.yml配置如下

    spring:
      profiles:
        active: peer1
    ---
    server:
      port: 1000
    eureka:
      instance:
        hostname: peer1 #主机
      client:
        registerWithEureka: false #禁止注册中心向自己注册
        fetchRegistry: false #禁止注册中心拉取注册地址清单
        serviceUrl: #微服务向注册中心注册的地址
          defaultZone: http://peer2:1001/eureka/
    spring:
      profiles: peer1
    ---
    server:
      port: 1001
    eureka:
      instance:
        hostname: peer2 #主机
      client:
        registerWithEureka: false #禁止注册中心向自己注册
        fetchRegistry: false #禁止注册中心拉取注册地址清单
        serviceUrl: #微服务向注册中心注册的地址
          defaultZone: http://peer1:1000/eureka/
    spring:
      profiles: peer2
    

    3.Ribbon

    ribbon是负载均衡器,是基于RestTemplate ,它赋予了RestTemplate 负载均衡的能力

    在客户端order中使用Ribbon

    3.1导入jar包

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    </dependency>
    

    3.2 写一个类,里面写RestTemplate方法

    RestTemplate简介: pring框架提供的RestTemplate类可用于在应用中调用rest服务,它简化了与http服务的通信方式,统一了RESTful的标准,封装了http链接, 我们只需要传入url及返回值类型即可。相较于之前常用的HttpClient,RestTemplate是一种更优雅的调用RESTful服务的方式。

    package cn.itsource.springcloud.config;
    
    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.client.RestTemplate;
    
    @Configuration
    public class BeanConfig {
    
        //交给Bean管理
        //@LoadBalanced :让RestTemplate 有负载均衡的能力
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate(){
            return new RestTemplate();
        }
    }
    

    3.3主配置类

    package cn.itsource.springcloud;
    
    import cn.itsource.springcloud.config.BeanConfig;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
    import org.springframework.context.annotation.Import;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @SpringBootApplication
    @RestController
    @Import(BeanConfig.class)
    public class OrderApplication {
       
        public static void main(String[] args) {
            new SpringApplicationBuilder(OrderApplication.class).web(true).run(args);
        }
    
    }
    

    3.4 Controller层方法

    @GetMapping("/order/user/{id}")
        public User getUserById(@PathVariable("id") Long id){
            //String url = "http://localhost:2000/user/"+id;
            String url = "http://user-server/user/"+id;
            User user = restTemplate.getForObject(url, User.class);
            return user;
        }
    

    3.5 application.yml

    eureka:
      client:
        serviceUrl:
          defaultZone: http://peer1:1000/eureka/,http://peer2:1001/eureka/
      instance:
        instance-id: first-one
        prefer-ip-address: true
    
    server:
      port: 2000
    
    spring:
      application:
        name: order
    

    4.Feign

    简介:Feign是基于Ribbon,同样具有负载均衡的能力

    4.1引入Feign的jar包

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    

    4.2 配置类打上标签 @EnableFeignClients(“cn.itsource.springcloud.feignclient”) feignclient是接口类的包名

    package cn.itsource.springcloud;
    
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.cloud.openfeign.EnableFeignClients;
    
    @SpringBootApplication
    @EnableFeignClients("cn.itsource.springcloud.feignclient")
    public class OrderApplication {
    
        public static void main(String[] args) {
            new SpringApplicationBuilder(OrderApplication.class).web(true).run(args);
        }
    }
    

    4.3 写一个接口类

    package cn.itsource.springcloud.feignclient;
    
    import cn.itsource.springcloud.domain.User;
    import cn.itsource.springcloud.fallback.UserFeignClientFallback;
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    
    //该客户端接口用来调用用户服务(user-server)
    // http://user-server/userserver/user/11  -> ribbon
    @FeignClient(value = "customer",fallback = UserFeignClientFallback.class)
    public interface UserFeignClient {
    
        //调用根据id获取用户的接口
        @GetMapping("/userserver/user/{id}")
        User getUserById(@PathVariable("id") Long id);
    }
    

    4.4 再写一个实现类

    package cn.itsource.springcloud.fallback;
    
    import cn.itsource.springcloud.domain.User;
    import cn.itsource.springcloud.feignclient.UserFeignClient;
    import org.springframework.stereotype.Component;
    
    @Component
    public class UserFeignClientFallback implements UserFeignClient {
    
        @Override
        public User getUserById(Long id) {
            //返回托底数据
            return new User(-1L,"null","用户服务获取失败");
        }
    }
    

    4.5 Controller控制层调用接口类

    package cn.itsource.springcloud.web.controller;
    
    import cn.itsource.springcloud.domain.User;
    import cn.itsource.springcloud.feignclient.UserFeignClient;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    //订单服务,消费者
    @RestController
    @RequestMapping("/orderserver")
    public class OrderServerController {
    
        @Autowired
        private UserFeignClient userFeignClient ;
    
        //浏览器调用,根据id获取用户 : 有负载均衡
        @GetMapping("/user/{id}")
        public User getUserById(@PathVariable("id")Long id){
            return userFeignClient.getUserById(id);
        }
    }
    

    4.6 application.yml

    eureka:
      client:
        serviceUrl:
          defaultZone: http://peer1:1000/eureka/,http://peer2:1001/eureka/
      instance:
        instance-id: order-second
        prefer-ip-address: true
    
    server:
      port: 2001
    
    spring:
      application:
        name: order-second
    

    5.Hystrix

    5.1 导包

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    </dependency>
    

    5.2 配置类打上注解标签(开启Hystrix)

    @EnableCircuitBreaker
    

    5.3 Controller控制层 (需在公共类上写一个AjaxResult)

    package cn.itsource.springcloud.web.controller;
    
    
    import cn.itsource.springcloud.domain.User;
    import cn.itsource.springcloud.utils.AjaxResult;
    import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    
    @RestController
    @RequestMapping("/orderserver")
    public class OrderController {
    
        @Autowired
        private RestTemplate restTemplate;
    
        //这是订单服务,调用用户服务
        @HystrixCommand(fallbackMethod = "getUserByIdFallback")
        @GetMapping("/user/{id}")
        public AjaxResult getUserById(@PathVariable("id")Long id){
            String url = "http://customer/userserver/user/"+id;
            //customer是yml配置中application.name名
            //userserver是控制层的mapping
            User user = restTemplate.getForObject(url, User.class);
    
            AjaxResult ajaxResult = new AjaxResult();
            ajaxResult.getData(user);
            return ajaxResult;
        }
    
        //编写降级方法
        public AjaxResult getUserByIdFallback(@PathVariable("id")Long id){
            AjaxResult ajaxResult = new AjaxResult();
            ajaxResult.setSuccess(false);
            ajaxResult.setErroMessage("抱歉,订单服务不可能");
            return ajaxResult;
        }
    }
    

    5.4 application.yml

    eureka:
      client:
        serviceUrl:
          defaultZone: http://peer1:1000/eureka/,http://peer2:1001/eureka/
      instance:
        instance-id: first-one
        prefer-ip-address: true
    
    server:
      port: 2000
    
    spring:
      application:
        name: order
    

    6.Zuul网关

    6.1 导入jar包

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
    </dependency>
    

    6.2 主配置类上打注解标签 @EnableZuulProxy//开启zuul网关

    package cn.itsource.springcloud;
    
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
    import org.springframework.web.bind.annotation.RestController;
    
    @EnableZuulProxy//开启zuul网关
    @SpringBootApplication
    @RestController
    public class ZuulApplication {
    
    
        public static void main(String[] args) {
            new SpringApplicationBuilder(ZuulApplication.class).web(true).run(args);
        }
    }
    

    6.3 application.yml

    eureka:
      client:
        serviceUrl:
          defaultZone: http://peer1:1000/eureka/,http://peer2:1001/eureka/
      instance:
        instance-id: first-one
        prefer-ip-address: true
    
    server:
      port: 4000
    
    spring:
      application:
        name: zuul-server
    
    zuul:
      routes:
        order: "/order/**" #别名---order是订单服务yml中application.name的名字
      prefix: "/pre" #前缀
      
      #浏览器访问格式:http://localhost:4000/pre/order/orderserver/user/10
    

    6.4 写一个过滤器的类,继承ZuulFilter,实现登录检查

    package cn.itsource.springcloud.filter;
    
    import com.netflix.zuul.ZuulFilter;
    import com.netflix.zuul.context.RequestContext;
    import com.netflix.zuul.exception.ZuulException;
    import org.apache.commons.lang.StringUtils;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.util.HashMap;
    
    public class ZuulByFilter extends ZuulFilter{
    
        //过滤器的类型 PRE_TYPE
        @Override
        public String filterType() {
            return "pre";
        }
    
        //过滤器的顺序
        @Override
        public int filterOrder() {
            return 1;
        }
    
        @Override
        public boolean shouldFilter() {
    
            //获取请求上下文
            RequestContext currentContext = RequestContext.getCurrentContext();
            //获取请求对象
            HttpServletRequest request = currentContext.getRequest();
            //获取请求的地址
            String requestURI = request.getRequestURI();
            //如果包含了login,则返回false
            if (requestURI.toUpperCase().contains("LOGIN")){
                return false;
            }
            return true;
        }
    
        //执行run方法-----中心方法
        @Override
        public Object run() throws ZuulException {
    
            //获取上下文对象
            RequestContext currentContext = RequestContext.getCurrentContext();
            //获取对象
            HttpServletRequest request = currentContext.getRequest();
            //获取相应对象
            HttpServletResponse response = currentContext.getResponse();
    
            //获取响应的数据格式
            response.setContentType("application/json;charset:utf-8");
            //获取请求头x-token
            String token = response.getHeader("x-token");
            //如果不存在请求头,则让重新登录
            if (StringUtils.isBlank(token)){
                HashMap<String,String> map = new HashMap<>();
                map.put("success", "false");
                map.put("errorMessage","麻烦请登录" );
                currentContext.setSendZuulResponse(false);
            }
            return null;
        }
    }
    

    7.Config

    7.1 导入jar包

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-config-server</artifactId>
    </dependency>
    

    7.2 主配置类打上注解标签

    package cn.itsource.springcloud;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.config.server.EnableConfigServer;
    
    //@EnableDiscoveryClient
    //@EnableConfigServer :开启配置中心
    @SpringBootApplication
    @EnableConfigServer
    public class ConfigServerApplication5000 {
        public static void main(String[] args) {
            SpringApplication.run(ConfigServerApplication5000.class);
        }
    }
    

    7.3 application.yml (放在码云仓库中)

    server:
      port: 5000
    spring:
      application:
        name: config-server
        
      #码云仓库地址
      cloud:
        config:
          server:
            git:
              uri: https://gitee.com/xxxxx/zuul-server.git  #码云仓库
              username: xxxxx
              password: xxxxx
    
    eureka:
      client:
        serviceUrl:
          defaultZone: http://peer1:1000/eureka/,http://peer2:1001/eureka/
      instance:
        prefer-ip-address: true #使用ip注册到注册中心
        instance-id: config-server:5000 #指定服务的id
    

    7.4 浏览器访问地址: localhost:5000/application-config-dev.yml

    实际要看码云中仓库名

    展开全文
  • Spring Cloud 五大组件

    2021-03-27 13:23:11
    Spring Cloud 五大组件 服务注册与发现——Netflix Eureka 负载均衡: 客户端负载均衡——Netflix Ribbon 服务端负载均衡:——Feign(其也是依赖于Ribbon,只是将调用方式RestTemplete 更改成Service 接口) ...

    Spring Cloud 五大组件

    • 服务注册与发现——Netflix Eureka

    • 负载均衡:

      • 客户端负载均衡——Netflix Ribbon
      • 服务端负载均衡:——Feign(其也是依赖于Ribbon,只是将调用方式RestTemplete 更改成Service 接口)
    • 断路器——Netflix Hystrix

    • 服务网关——Netflix Zuul

    • 分布式配置——Spring Cloud Config

    展开全文
  • springcloud五大组件

    2019-11-16 21:48:40
  • Spring cloud 五大组件

    2019-10-27 19:02:36
    而非地方

    1.Zuul:网关
    2.Eureka:注册中心
    3.Ribbon:负载均衡
    4.Feign:服务调用
    5.Hystix:熔断器

    1.zuul网关 (动态路由)
    为什么会出现一个zuul网关?
    因为我们所用的微服务的框架,写好的每一个服务可以通过外面直接请求,这样的话对外暴露会有安全性的问题。那么怎么办?
    第一个办法就是在每一个服务外面加一层校验逻辑,那样会显得比较麻烦
    第二个办法就是做一个围墙,将校验逻辑写在围墙里面,然后再提供一个入口,再将微服的地址都暴露给zuul网关,zuul网关再将地址暴露给外界,外界再通过地址请求

    网关的核心功能是:过滤和路由

    2.Eureka:注册中心
    注册中心有什么作用?
    它是一个注册服务和拉取服务的过程
    有一个调用者和一个提供者还可以做到监控服务
    在默认的时间内会发送一个心跳周期30秒,90秒如果没有发送就会认为服务宕机。

    3.Ribbon:负载均衡
    负载均衡的就是创建多个同样的服务,当其中一个服务挂掉了那么其他的服务将会接替它,负载均衡底层有两种算法,一种是轮播,一种是随机

    4.Feign:服务调用
    feign的作用就是伪装请求,将Rest的请求进行隐藏,伪装成类似SpringMVC的controller一样。你不用再自己拼接URL,拼接参数等等操作,一切都交给feign去做。

    5.Hystix:熔断器
    为什么会出现熔断器?

    熔断降级

    1先说一下降级
    hystrix为每一个微服务提供一个小线程池,如果线程池已满调用将被立即拒绝。默认不采用排队加速失败判断时间。
    服务降级会导致请求失败,但是不会导致阻塞,对其他的服务没有什么影响。

    2.熔断
    熔断是在降级的基础上来实现的,熔断分为三种状态
    第一种:熔断器是关闭的
    第二种:熔断器是打开,那么所有的请求将会被降级,当一定时间内失败次数达到了阈值,那么将会被熔断。
    第三种:半开状态。

    展开全文
  • SpringCloud五大组件Config SpringCloudConfig配置中心我们使用Bus来做刷新配置 简介: Spring Cloud Config 是 Spring Cloud 家族中最早的配置中心,虽然后来又发布了 Consul 可以代替配置中心功能,但是 Config ...
  • Spring Cloud五大组件概述 五大组件 注册中心 eurake,zookeeper 日志跟踪 sleuth,zipkin 配置中心 config server 熔断器 hystrix 智能路由 zuul(路由)、ribbon(负载均衡) ...
  • SpringCloud五大组件Zuul

    2020-07-28 15:10:27
    SpringCloud五大组件Zuul 介绍: Zuul是Netflix开源的微服务网关,可以和Eureka、Ribbon、Hystrix等组件配合使用,Spring Cloud对Zuul进行了整合与增强,Zuul默认使用的HTTP客户端是Apache HTTPClient,也可以使用...
  • SpringCloud五大组件之一Eureka 首先我们先创建一个Maven主项目,引入SpringBoot 2.1.15.RELEASE 并且使用SpringCloud版本为Greenwich.SR6(亲测SpringBoot2.1.15和SpringCloud版本Greenwich.SR6可以完美融合一起)...
  • SpringCloud五大组件Hystrix 分布式系统环境下,服务间类似依赖非常常见,一个业务调用通常依赖多个基础服务。如下图,对于同步调用,当库存服务不可用时,商品服务请求线程被阻塞,当有大批量请求调用库存服务时,...
  • springcloud五大组件1:什么是eureka?2:什么是ribbon?3:什么是hystrix?4:什么是feign?5:什么是zuul? 1:什么是eureka? eureka是服务的注册中心 ,它的作用是为我们微服务提供服务的注册与发现,Eureka...
  • SpringCloud五大组件详细分析&配置1.服务发现——Netflix Eureka1.1.什么是Eureka1.2.Eureka和Zookeeper...
  • SpringCloud五大组件之Ribbon 一、ribbon简介 Ribbon是一个负载均衡客户端,可以很好的控制HTTP和TCP的一些行为。Feign默认集成了Ribbon。 二、准备工作 基于上一篇文章,重新新建一个SpringBoot工程;在它的pom.xml...
  • 文章目录1、SpringCloud2、SpringCloud怎么学习3、微服务概述:3.1、微服务优缺点4、SpringCloud是什么4.1、SpringCloud和SpringBoot关系4.2、SpringCloud能干什么4.3、SpringCloud在哪儿下5、Rest学习环境搭建6、...
  • SpringCloud 之熔断监控 Hystrix Dashboard SpringCloud 之监控数据聚合 Turbine 配置中心 SpringCloud 之配置中心 Config(Git 版) SpringCloud 之配置中心 Config(高可用) SpringCloud 之配置中心 ...
  • springcloud是微服务架构的集大成者,将一系列优秀的组件进行了整合。基于springboot构建。 springcloud的版本说明: springcloud项目是由多个独立项目集合而成的,每个...SpringCloud 5常用组件 服务发现—...
  • springcloud是微服务架构的集大成者,将一系列优秀的组件进行了整合。基于springboot构建,对我们熟悉spring的程序员来说,上手比较容易。通过一些简单的注解,我们就可以快速的在应用中配置一下常用模块并构建庞大...
  • 首先本机先要安装以下环境,建议先学习了解springboot和springcloud基础知识。 git java8 maven 开发环境搭建 linux和mac下可在项目根目录下执行 ./install.sh 快速搭建开发环境。如要了解具体的步骤,请看如下...
  • 初识SpringCloudSpring Cloud 是一套完整的微服务解决方案,基于 Spring Boot 框架,准确的说,它不是一个框架,而是一个的容器,它将市面上较好的微服务框架集成进来,从而简化了开发者的代码量。Spring Cloud 是...
  • 训练大纲(第116天)大家如果想快速有效的学习,思想核心是“以建立知识体系为核心”,具体方法是“守破离”。确保老师课堂上做的操作,反复练习直到熟练。第223次(Spring Cloud)... Spring Cloud介绍(1) 什么是Spr...
  • Spring Cloud初识Spring Cloud一、SpringCloud简介1.1 SpringCloud介绍1.2 spring cloud 包含的众多子项目二、微服务架构2.1 微服务架构简介2.2 微服务架构与SOA架构的区别2.3 微服务架构如何拆分2.4 微服务的优缺点...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 864
精华内容 345
关键字:

springcloud五大组件

spring 订阅