IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> SpringCloud阶段总结 -> 正文阅读

[Java知识库]SpringCloud阶段总结

SpringCloud阶段总结

练习项目环境准备

构建父工程

  • 选用的spring-cloud的版本是Hoxton.SR1,springboot的版本是2.2.2.RELEASE,springcloudalibaba的版本是2.1.0.RELEASE
 <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>


    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <junit.version>4.12</junit.version>
    <log4j.version>1.2.17</log4j.version>
    <lombok.version>1.18.24</lombok.version>
    <mysql.version>5.1.47</mysql.version>
    <druid.spring.boot.starter>1.1.22</druid.spring.boot.starter>
    <mybatis.spring.boot.version>2.2.2</mybatis.spring.boot.version>
    <spring.boot.dependencies.version>2.2.2.RELEASE</spring.boot.dependencies.version>
    <spring.cloud.alibaba.dependencies.version>2.1.0.RELEASE</spring.cloud.alibaba.dependencies.version>
    <spring.cloud.dependencies.version>Hoxton.SR1</spring.cloud.dependencies.version>
  </properties>
  • 在父工程中加入dependencyManagement(依赖管理器),dependencyManagement可以将项目中用到的maven地址进行统一的管理,保证子项目中的maven坐标的版本号一致
  • 注意在子项目中仍然需要引入manven坐标
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>${mysql.version}</version>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid-spring-boot-starter</artifactId>
      <version>${druid.spring.boot.starter}</version>
    </dependency>
    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>${mybatis.spring.boot.version}</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>${junit.version}</version>
    </dependency>
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>${log4j.version}</version>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>${lombok.version}</version>
      <optional>true</optional>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-dependencies</artifactId>
      <version>${spring.boot.dependencies.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-dependencies</artifactId>
      <version>${spring.cloud.dependencies.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
    <!--spring cloud alibaba 2.1.0.RELEASE-->
    <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>${spring.cloud.alibaba.dependencies.version}</version>
    <type>pom</type>
    <scope>import</scope>
    </dependency>



  </dependencies>
</dependencyManagement>
  • 加入maven打包插件
  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
          <fork>true</fork>
          <addResources>true</addResources>
        </configuration>
      </plugin>
    </plugins>
  </build>

服务注册

  • 将所有微服务到服务注册中心,进行统一的管理

Eureka

使用步骤

  • 创建eureka微服务
  • 导入eureka maven坐标
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            <version>2.2.2.RELEASE</version>
</dependency>
  • 编写eureka yml配置文件
server:
 port: 7001
spring:
 application:
   name: eureka-service
eureka:
 instance:
   hostname: localhost # 配置eureka地址
 client:
 #不向注册中心注册自己
   register-with-eureka: false
   #自己是注册中心,不用获取注册表
   fetch-registry: false
   service-url:
     defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
 server:
   enable-self-preservation: true # 开启/关闭自我保护
  • 在服务端启动类上添加@EnableEurekaServer注解
  • 在微服务添加eureka客户端maven坐标
 <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        <version>2.2.2.RELEASE</version>
    </dependency>
  • 编写yml配置文件
eureka:
  client:
   	register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://127.0.0.1:7001/eureka/
        #    #不向注册中心注册自己

注意: defaultZone在编写时没有智能提示,当时我在运行项目时,因为字母拼写错误,并且直接复制到另一个微服务项目中,结果两个都无法运行,最后才发现是拼写错误,在此记录一下那段不堪回首的岁月。

  • 在启动类上添加@EnableEurekaClient、@EnableDiscoveryClient注解,
    第一个注解作用是,启动eureka的客户端,第二个注解时可以获取在eureka中注册的服务信息(在后面的ribbon的使用中会进行描述)

服务调用

  • 两种方式,一种是restTemplete+Ribbon实现服务的调用
  • 另一种是使用springcloude官方推荐的openfeign进行服务的远程调用

RestTmplete+Ribbon

  • 使用方法简单, 在配置类中注入RestTemplete,并且添加**@LoadBalanced**注解
  • 使用testtemplete注解进行服务的调用,即将IP地址与端口替换成服务的名称
  • 如何被调用服务中是微服务集群,则默认采用轮询算法(Round)

负载均衡

  • Ribbon是服务器内的负载均衡,即选择访问哪个微服务项目,Nginx是实现服务器端的负载均衡,决定访问哪个服务器
  • 实现负载均衡算法的替换
  • 在启动类所在包之外新建配置文件(将配置文件放在@CompentSacn注解扫描不到的包下方),可以实现对特定微服务的定制化算法更换
    在这里插入图片描述
  • 在Myribbonrule配置类中,注入Irule实现类,添加@Configuration注解
@Configuration
public class Myribbonrule {
    @Bean
    public IRule iRule(){
        return new RandomRule();
    }
}
  • Ribbon内置的负载均衡策略
  • 手写Ribbon的轮询算法
  • 实现原理:此时请求的次数%该微服务集群的数量=本次请求第几个微服务
@GetMapping("getport")
    public R getport() {
        String url = "http://PAYMENT-SERVICE/port";

        List<ServiceInstance> instancesById = discoveryClient.getInstances("PAYMENT-SERVICE");
        ServiceInstance choicceservice = loaeBalance.choicceservice(instancesById);
//        return new R(200,choicceservice.getUri().toString(),null);
        ResponseEntity<R> forEntity = restTemplate.getForEntity( choicceservice.getUri()+"/port", R.class);
        //        System.out.println(instancesById);
        return forEntity.getBody();

//return
    }
public interface LoaeBalance {
   ServiceInstance choicceservice(List<ServiceInstance> instancesById);
}
@Component
public class LoadBalanceiml implements LoaeBalance {
    //    原子类实现整型的加加减减操作
    private AtomicInteger atomicInteger;//代表的是次数

    public LoadBalanceiml() {
        this.atomicInteger = new AtomicInteger(0);
    }

    // 获取第几次请求
    int getcurrent(int count) {
        int current;
        int next;
        do {
            current = atomicInteger.get();//获取此时是第几次请求

            next = current >= Integer.MAX_VALUE ? 0 : current + 1;
        } while (!this.atomicInteger.compareAndSet(current, next)); //两者相等的时候跳出循环,保证线程安全

        return next;

    }

    @Override
    public ServiceInstance choicceservice(List<ServiceInstance> instancesById) {
        if (instancesById==null || instancesById.size()==0){
            return null;
        }
        int count=instancesById.size();
//        获取到取第几个服务实例
        int next = getcurrent(count);
//
        next=next%count;//取余数获取列表下标
        return instancesById.get(next);


    }
}

OpenFeign

  • 添加openfeign的pom坐标
 <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-openfeign</artifactId>
       </dependency>
        <!------feign连接池坐标----->
       <dependency>
           <groupId>io.github.openfeign</groupId>
           <artifactId>feign-httpclient</artifactId>
       </dependency>
  • 在启动类上添加@EnableFeignClients注解
  • 新建feign接口,添加@FeignClient注解,
@FeignClient(value = "PAYMENT-SERVICE",configuration = FeignConfiogure.class)
public interface Feighdao {
    //    增加流水
    @PostMapping
    public R addcontroller(@RequestBody Payment payment);


    @GetMapping("port")
    public R<String> getport();

    //    增加流水
    @GetMapping("{id}")
public R<Payment> getpayment(@PathVariable(value = "id") long id); //类路径添加值

注意如何使用@pathvariable注解时,需要将参数名称写入value参数中,@PathVariable(value = “id”) long id否则会报错,血与泪的教训。

  • 基于注解的方式添加日志级别
public class FeignConfiogure {

//    修改日志级别
    @Bean
    public Logger.Level feignLoggerLevel() {
        return  Logger.Level.BASIC;
    }
}
  • 配置yml文件
feign:
  client:
    config:
      PAYMENT-SERVICE:
        loggerLevel: BASIC
          # 连接超时时间,默认2s,设置单位为毫秒
        connectTimeout: 2000
          # 请求处理超时时间,默认5s,设置单位为毫秒。
        readTimeout: 5000 
  httpclient:
  # 最大连接池数
    max-connections: 200
    # 单路径最大连接池数
    max-connections-per-route: 50
   
  • 基于配置文件修改feign的日志级别可以针对单个服务:
feign:  
  client:
    config: 
      userservice: # 针对某个微服务的配置
        loggerLevel: FULL #  日志级别 

也可以针对所有服务:

feign:  
  client:
    config: 
      default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
        loggerLevel: FULL #  日志级别 

而日志的级别分为四种:

  • NONE:不记录任何日志信息,这是默认值。
  • BASIC:仅记录请求的方法,URL以及响应状态码和执行时间
  • HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息
  • FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-09-13 10:59:34  更:2022-09-13 11:00:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 12:37:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码