欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringCloud学习笔记

程序员文章站 2022-03-20 11:18:32
...

目录

1.SpringCloud 简介

1.1.什么是 SpringCloud

1.2.SpringCloud 与 SpringBoot 的关系

1.3.SpringCloud 主要框架

1.4.SpringCloud 与 Dubbo 对比

1.5.说说 SpringCloud 的版本

2.服务发现组件 Eureka

2.1.Eureka简介

2.2.Eureka服务端开发

1)搭建Eureka服务端微服务项目

​2)在pom.xml导入eureka服务端依赖

3)在application.yml配置eureka服务端

4)编写启动类(Eureka服务端注解)

2.3.Eureka客户端(服务注册)

1)在pom.xml导入eureka客户端依赖

2)在application.yml配置eureka客户端

3)在启动类添加Eureka客户端注解

4)访问Eureka主页http://127.0.0.1:6868/

2.4.保护模式

3. Feign 实现服务间调用

3.1.Feign简介

3.2.案例

1)在pom.xml导入feign坐标

2)在启动类添加Feign注解

3)编写远程调用接口(*)

4)使用远程调用接口完成服务调用

3.3.负载均衡(默认轮询)


1.SpringCloud 简介

1.1.什么是 SpringCloud

Spring Cloud 是一系列框架的有序集合。它利用 Spring Boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、熔断器、数据监控等,都可以用 Spring Boot 的开发风格做到一
键启动和部署。Spring 并没有重复制造*, 它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过 Spring Boot 风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、 易部署和易维护的分布式系统开发工具包。
Spring Cloud 项目的官方网址:http://projects.spring.io/spring-cloud/

 

1.2.SpringCloud SpringBoot 的关系

Spring Boot Spring 的一套快速配置脚手架,可以基于 Spring Boot 快速开发单个微服务, Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具;Spring Boot 专注于快速、方便 集成的单个微服务个体,Spring Cloud关注全局的服务治理框架;
Spring Cloud可以不基于 Spring Boot 吗?
不可以。
 

1.3.SpringCloud 主要框架

服务发现——Netflix Eureka
服务调用——Netflix Feign
熔断器———Netflix Hystrix
服务网关——Netflix Zuul
分布式配置—Spring Cloud Config
消息总线 ——Spring Cloud Bus
 

1.4.SpringCloud Dubbo 对比

Dubbo 只是实现了服务治理,而 Spring Cloud 下面有 17 个子项目(可能还会新增)分别覆盖了微服务架构下的方方面面,服
务治理只是其中的一个方面,一定程度来说,Dubbo 只是 Spring CloudNetflix 中的一个子集。
 
  Dubbo   SpringCloud
服务注册中心  Zookeeper  Spring Cloud Netflix Eureka
服务调用方式  RPC  REST API
服务网关  无  Spring Cloud Netflix Zuul
熔断器  不完善  Spring Cloud Netflix Hystrix
分布式配置  Spring Cloud Config
服务跟踪  无  Spring Cloud Sleuth
消息总线   Spring Cloud Bus
数据流   Spring Cloud Stream
批量任务  Spring Cloud Task
……  ……  ……

1.5.说说 SpringCloud 的版本

Spring Boot  Spring Cloud
1.2.x  Angel 版本
1.3.x  Brixton 版本
1.4.x  Camden 版本
1.5.x  Dalston 版本、Edgware 版本
2.0.x  Finchley 版本
 

2.服务发现组件 Eureka

2.1.Eureka简介

EurekaNetflix开发的服务发现框架SpringCloud将它集成在自己的子项目
spring-cloud-netflix中,实现SpringCloud的服务发现功能。Eureka包含两个组件:
EurekaServerEurekaClient
 
 

2.2.Eureka服务端开发

1)搭建Eureka服务端微服务项目

SpringCloud学习笔记
2)在pom.xml导入eureka服务端依赖

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


3)在application.yml配置eureka服务端

server:
  port: 6868

eureka:
  client:
    registerWithEureka: false   #是否将自己注册到 Eureka 服务中,本身就是,无需注册
    fetchRegistry: false  #是否从Euraka中获取注册信息
    serviceUrl: #Eureka 客户端与 Eureka 服务端进行交互的地址
      defaultZone: http://127.0.0.1:${server.port}/eureka/


4)编写启动类(Eureka服务端注解)

package com.tensquare.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServer {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServer.class, args);
    }
}

 

2.3.Eureka客户端(服务注册

SpringCloud学习笔记

1)在pom.xml导入eureka客户端依赖

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


2)在application.yml配置eureka客户端

server:
  port: 9010
spring:
  application:
    name: tensquare-friend

eureka:
  client:
    service-url:
      defaultZone: http://localhost:6868/eureka
    instance:
      prefer-ip-address: true



3)在启动类添加Eureka客户端注解

package com.tensquare.friend;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class FriendApplication {
    public static void main(String[] args) {
        SpringApplication.run(FriendApplication.class,args);
    }

}

 

4)访问Eureka主页http://127.0.0.1:6868/

如图所示,我们单个微服务注册成功

SpringCloud学习笔记

 

2.4.保护模式

如果在EurekaServer的首页看到以下这段提示,则说明Eureka已经进入了保护模式:
SpringCloud学习笔记
EurekaServer在运行期间,会统计心跳失败的比例在15分钟之内是否低于85%,如果出现
低于的情况(在单机调试的时候很容易满足,实际在生产环境上通常是由于网络不稳定导
致),EurekaServer会将当前的实例注册信息保护起来,同时提示这个警告。保护模式主要
用于一组客户端和EurekaServer之间存在网络分区场景下的保护。一旦进入保护模式,
EurekaServer将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据(也就是
不会注销任何微服务)。
 
SpringCloud学习笔记

3. Feign 实现服务间调用

3.1.Feign简介

Feign是简化JavaHTTP客户端开发的工具(java-to-httpclient-binder),它的灵感
来自于RetrofitJAXRS-2.0WebSocketFeign的初衷是降低统一绑定DenominatorHTTP
API的复杂度,不区分是否为restful
 

3.2.案例

SpringCloud学习笔记

1)在pom.xml导入feign坐标

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

2)在启动类添加Feign注解

package com.tensquare.friend;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import util.JwtUtil;
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableDiscoveryClient
public class FriendApplication {
    public static void main(String[] args) {
        SpringApplication.run(FriendApplication.class,args);
    }

}

3)编写远程调用接口(*)

package com.tensquare.friend.client;
import entity.Result;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * 调用其他微服务注意事项
 * 1.调用方与被调用方都需要注册eureka中
 * 2.调用接口需要写上被调用方的服务名,即application.yml中的spring: application: name: tensquare-user
 * 3.服务名不能带下划线_,eureka会识别不到
 * 4.调用方法跟被调用方contorller方法名一致
 * aaa@qq.com记得带上全url,例如最上方的/user
 * aaa@qq.com后一定要带上("参数"),参数需要跟上方路径参数一致,否则会识别不到参数
 */
@FeignClient("tensquare-user")
public interface UserClient {

    /**
     * 更新用户关注数
     */
    @RequestMapping(value = "/user/updateFollowcount/{userid}/{x}", method = RequestMethod.PUT)
    public Result updateFollowcount(@PathVariable("userid") String userid, @PathVariable("x") int x);

    /**
     * 更新用户粉丝
     */
    @RequestMapping(value = "/user/updateFanscount/{userid}/{x}", method = RequestMethod.PUT)
    public Result updateFanscount(@PathVariable("userid") String userid, @PathVariable("x") int x);

}


4)使用远程调用接口完成服务调用

 

3.3.负载均衡(默认轮询)

测试:同时开启多个基础微服务,看是否是轮流调用。