zoukankan      html  css  js  c++  java
  • spring cloud 学习笔记一

    1.概念

    Spring cloud是一个基于Spring Boot实现的服务治理工具包,在微服务架构中用于管理和协调服务的。

    2.spring cloud入门环境搭建

     

    1)搭建环境

     

           maven多模块化的方法搭建

     

    2)注册中心

     

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

     

    3)服务提供者

     

    4)服务消费者

    --父类pom.xml限定springboot和cloud的版本

    <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <spring-cloud.version>Finchley.SR1</spring-cloud.version>
    <springboot.version>2.0.5.RELEASE</springboot.version>
    </properties>

    <dependencyManagement>
    <dependencies>
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>${spring-cloud.version}</version>
    <type>pom</type>
    <scope>import</scope>
    </dependency>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>${springboot.version}</version>
    <type>pom</type>
    <scope>import</scope>
    </dependency>
    </dependencies>
    </dependencyManagement>

    --注册中心eureka
    1.导包

    <!--springboot支持-->
    <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>

    <!--Eureka服务端支持-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>

    2.配置yaml application.yml

    server:
    port: 7001
    eureka:
    instance:
    hostname: localhost
    client:
    registerWithEureka: false #是否要注册到eureka
    fetchRegistry: false #表示是否从Eureka Server获取注册信息
    serviceUrl:
    defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #单机配置

    3.配置启动类

    @SpringBootApplication//标识为springboot项目
    @EnableEurekaServer//标识为eureka的服务端
    public class EurekaApplicationn7001 {

    public static void main(String[] args) {
    SpringApplication.run(EurekaApplicationn7001.class);
    }
    }

    4.测试

    --springcloud 服务提供者
    导包
    1.controller
    @RestController
    @RequestMapping("/provider")
    public class UserController {
    @RequestMapping("/user/{id}")
    public User getuser(@PathVariable("id") Long id){

    return new User(id,"ss");
    }
    }


    2.yaml配置
    server:
    port: 8001
    spring:
    application:
    name: USER-PROVIDER #不要使用下划线
    eureka:
    client:
    service-url:
    defaultZone: http://localhost:7001/eureka #告诉服务提供者要把服务注册到哪儿,注册中心的地址
    3.启动类
    @SpringBootApplication
    @EnableEurekaClient//标识为eqreka的客户端
    public class UserProviderApplication8001 {
    public static void main(String[] args) {
    SpringApplication.run(UserProviderApplication8001.class);
    }
    }
    --spring cloud入门消费者
    导包
    <dependencies>
    <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>com.xxxxx.springcloud</groupId>
    <artifactId>interface-common</artifactId>
    <version>1.0-SNAPSHOT</version>
    </dependency>

    1.yaml
    server:
    port: 9001


    2.入口函数

    @SpringBootApplication
    public class UserConsumerApplication9001 {

    public static void main(String[] args) {
    SpringApplication.run(UserConsumerApplication9001.class);
    }

    3.controller
      --1.使用resttemplate传入服务地址,直接发起请求调用,与注册中心没有关系
    @RestController
    @RequestMapping("/consumer")
    public class UserController {
    @RequestMapping("/user/{id}")
    public User getUserById(@PathVariable("id") Long id){
    //通过resttemplate来获取服务地址
    RestTemplate restTemplate = new RestTemplate();
    //http://localhost:8001/provider/user/1
    return restTemplate.getForObject("http://localhost:8001/provider/user/"+id, User.class);
    }
    }


    --或者可以配置一个resttemplate,方便调用
    //目的是把RestTemplate实例交给spring管理,就可以直接使用的时候依赖注入就ok了,不再去new对象
    @Configuration
    public class RestTemplateBean {
    @Bean
    public RestTemplate getRestTemplate(){

    return new RestTemplate();
    }
    }

    相当于springxml中配置bean

    @RestController
    @RequestMapping("/consumer")
    public class UserController {

    @Autowired
    private RestTemplate restTemplate;
    @RequestMapping("/user/{id}")
    public User getUserById(@PathVariable("id") Long id){
    //通过resttemplate来获取服务地址
    //1.直接new resttemplate对象
    //RestTemplate restTemplate = new RestTemplate();
    //2、可直接配置一个resttemplate,方便调用

    //http://localhost:8001/provider/user/1
    return restTemplate.getForObject("http://localhost:8001/provider/user/"+id, User.class);
    }
    }



    --注册中心集群

    如果只有一个注册中心服务器,会存在单点故障;可以配置多个注册中心服务器,相互依赖,且做同样的事情,保证一个服务器死机后,仍然可以访问

    集群的两个项目功能都是一样的,为了保证高可用,应该部署在不同的服务器的上,所以我们应该至少有2ip地址,这里,我们通过修改localhost文件,模拟2个不同的服务地址。

    步骤:就是把这个eureka_server_7002拷贝一份

    1:映射hosts 模拟域名解析 C:WindowsSystem32driversetc

    127.0.0.1       eureka-7001.com

    127.0.0.1       eureka-7002.com

    --只需将注册中心7001代码复制一份端口号改成7002

    --在yaml配置文件中修改地址信息,两个服务相互依赖即可

    server:
    port: 7002
    eureka:
    instance:
    hostname: www.eureka-7002.com
    client:
    registerWithEureka: false #是否要注册到eureka
    fetchRegistry: false #表示是否从Eureka Server获取注册信息
    serviceUrl:
    defaultZone: http://www.eureka-7001.com:7001/eureka/ #这里是另一个中心的地址
    同理在7001的配置文件配置7002的地址;
    这样就可以解决单点故障问题
    --测试访问



    --springcloud入门加强之消费者负载均衡

    1.ribbon 负载均衡

    RibbonNetflix发布的云中间层服务开源项目,主要功能是提供客户端(消费者方)负载均衡算法Ribbon客户端组件提供一系列完善的配置项,如,连接超时,重试等。简单的说,Ribbon是一个客户端负载均衡器,我们可以在配置文件中列出load Balancer后面所有的机器,Ribbon会自动的帮助你基于某种规则(简单轮询,随机连接)去连接这些机器,我们也很容易使用Ribbon实现自定义的负载均衡算法。

    --单服务提供者操作

    导包

    <dependency>
    <groupId>com.xxxxx.springcloud</groupId>
    <artifactId>interface-common</artifactId>
    <version>1.0-SNAPSHOT</version>
    </dependency>

    <!--springboot支持-->
    <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>

    <!--eureka客户端,服务消费者也要从注册中心获取可用服务列表-->
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    入口函数
    @SpringBootApplication//标志为springboot项目
    @EnableEurekaClient//标志为eureka的客户端--消费者需要在注册中心获取服务
    public class UserApplication9002 {
    public static void main(String[] args) {
    SpringApplication.run(UserApplication9002.class );
    }
    }


    --配置一个bean并开启负载均衡
    //目的是把RestTemplate实例交给spring管理,就可以直接使用的时候依赖注入就ok了,不再去new对象
    @Configuration
    public class RestTemplateBean {
    @Bean
    @LoadBalanced//开启负载均衡
    public RestTemplate getRestTemplate(){

    return new RestTemplate();
    }
    }


    --yaml

    server:
      port: 9002
    eureka:
      client:
       registerWithEureka: false #不注册到Eureka,不在注册中心显示
       service-url:
          #defaultZone: http://localhost:7001/eureka
          defaultZone:   http://www.eureka-7001.com:7001/eureka,http://www.eureka-7002.com:7002/eureka

    --controller
    @Autowired
    private RestTemplate restTemplate;
    @RequestMapping("/user/{id}")
    public User getUserById(@PathVariable("id") Long id){

    return restTemplate.getForObject("http://USER-PROVIDER/provider/user/"+id, User.class);
    }
    }
    --入口函数
    @SpringBootApplication//标志为springboot项目
    @EnableEurekaClient//标志为eureka的客户端--消费者需要在注册中心获取服务
    public class UserApplication9002 {
    public static void main(String[] args) {
    SpringApplication.run(UserApplication9002.class );
    }
    }


    -- 多服务提供者负载高级操作

    1.导包
    2.配置多个服务提供者
    3.配置消费者riddon为负载均衡

    @Configuration
    public class RestTemplateBean {
    @Bean
    @LoadBalanced//开启负载均衡
    public RestTemplate getRestTemplate(){

    return new RestTemplate();
    }
    }
    测试结果

    --负载均衡策略

    内置负载均衡规则类

    规则描述

    RoundRobinRule(默认)

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

    AvailabilityFilteringRule

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

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

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

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

     

     

    WeightedResponseTimeRule

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

    ZoneAvoidanceRule

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

    BestAvailableRule

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

    RandomRule

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

    Retry

    重试机制的选择逻辑


    //目的是把RestTemplate实例交给spring管理,就可以直接使用的时候依赖注入就ok了,不再去new对象
    @Configuration
    public class RestTemplateBean {
    @Bean
    @LoadBalanced//开启负载均衡
    public RestTemplate getRestTemplate(){

    return new RestTemplate();
    }
    // 负载均衡测试替换
    @Bean
    public IRule myRule(){
    return new RandomRule();
    }
    }
    直接自定义负载均衡策略,就可以替换默认的策略。。。。。
    --feign

    通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息。而Feign则会完全代理HTTP请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关处理

    Feign是以接口方式进行调用,而不是通过RestTemplate来调用,feign底层还是ribbon,它进行了封装,让我们调用起来更加方便

    1.导包

      <!--feign的支持-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

    2.定义接口

    //调用服务名字
    //要和服务提供者里面访问地址和参数等保持一致。
    @FeignClient(value = "USER-PROVIDER")
    @RequestMapping("/provider")
    public interface UserCilent {
    @RequestMapping("/user/{id}")//地址也必须是跟提供者的地址一致
    User getuser(@PathVariable("id") Long id);//必须跟提供者方法签名一致
    }
    3.配置yaml
    server:
    port: 9003
    eureka:
    client:
    registerWithEureka: false #不注册到Eureka,不在注册中心显示
    service-url:
    defaultZone: http://eureka-7001.com:7001/eureka,http://eureka-7002.com:7002/eureka

     

    4.controller
    @RestController
    @RequestMapping("/consumer")
    public class UserController {

    @Autowired
    private UserCilent userCilent;
    @RequestMapping("/user/{id}")
    public User getuser(@PathVariable("id") Long id){
    return userCilent.getuser(id);
    }
    }
    6.入口函数
    @SpringBootApplication//标志为springboot项目
    //@EnableEurekaClient//标志为eureka的客户端--消费者需要在注册中心获取服务
    @EnableFeignClients(basePackages = "cn.dddddd.springcloud.service") //扫描本地feign的接口
    public class UserApplication9003 {
    public static void main(String[] args) {
    SpringApplication.run(UserApplication9003.class );
    }
    }

    测试效果不好展示,总结没毛病!
     




     

    RoundRobinRule(默认)

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

  • 相关阅读:
    sql2005新特性 for xml , outer apply ,多行转成单列方法
    数据库备份还原到指定时间
    在 64 位版本的 Windows 上,如何在 32 位版本的 ASP.NET 1.1 和 64 位版本的 ASP.NET 2.0 之间切换
    人事管理系统的一般功能需求
    转支持非主键排序的SQL存储过程
    正则表达式删除指定的HTML 标签
    PAZU 4Fang WEB 打印控件
    ASP.NET木马及Webshell安全解决方案
    vue3+element 父组件子组件传值
    彻底理解01背包问题
  • 原文地址:https://www.cnblogs.com/wgyi140724-/p/10586192.html
Copyright © 2011-2022 走看看