SpringCloud的实用篇

1.服务架构演进

架构过程简介
单体架构:简单方便,高度耦合,扩展性差
|
分布式架构:松耦合,扩展性好,但架构复杂,难度大。适合大型互联网项目,例如:京东、淘宝(SOA分布式架构)
|
微服务:一种良好的分布式架构方案(SpringCloud+SpringBoot)
优点:拆分粒度更小、服务更独立、耦合度更低
缺点:架构非常复杂,运维、监控、部署难度提高

服务拆分粒度如何?(注意事项)
不同微服务,不要重复开发相同业务
微服务数据独立,不要访问其它微服务的数据库
微服务可以将自己的业务暴露为接口,供其它微服务调用

1.1 SpringCloud

  • SpringCloud是目前国内使用最广泛的微服务技术栈。官网地址:https://spring.io/projects/spring-cloud。

  • SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验:
    在这里插入图片描述

  • SpringCloud与SpringBoot的版本兼容关系如下:
    在这里插入图片描述

2.0 远程调用什么是RestTemplate?

基于RestTemplate发起的http请求实现远程调用
http请求做远程调用是与语言无关的调用,只要知道对方的ip、端口、接口路径、请求参数即可

如何使用RestTemplate?
答:
第一步:注册RestTemplate

@Bean
public RestTemplate restTemplate(){
    return new RestTemplate();
}

第二步:注入RestTemplate

   @Autowired
    private RestTemplate restTemplate;

第三步:调用api发送http请求

    String url = "http://localhost:18081/user/"+orderInfo.getUserId();
    User user = restTemplate.getForObject(url, User.class);

按照上面调用流程,消费者调用服务者存在很多问题:

1:服务消费者该如何获取服务提供者的地址信息?
2:如果有多个服务提供者,消费者该如何选择?
3:消费者如何得知服务提供者的健康状态?

接下来我们到SpringCloud组件之一 :eureka 也就是注册中心,,,,后来springcloud把nacos也是注册中心组件也加了进来

3 注册中心-Eureka

Eureka工作原理

#1:消费者该如何获取服务提供者具体信息?
	服务提供者启动时向eureka注册自己的信息
	eureka保存这些信息
	消费者根据服务名称向eureka拉取提供者信息
	
#2:如果有多个服务提供者,消费者该如何选择?
	服务消费者利用负载均衡算法,从服务列表中挑选一个
	
#3:消费者如何感知服务提供者健康状态?
	服务提供者会每隔30秒向EurekaServer发送心跳请求,报告健康状态
	EurekaServer在90秒内没有接收到某个微服务节点的心跳,EurekaServer将会注销该微服务的节点
	消费者就可以拉取到最新的信息

3.1 搭建EurekaServer

如何搭建EurekaServer?
答:
1.创建注册中心微服务,引入eureka-server依赖

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

2.创建启动类,在启动类上添加@EnableEurekaServer注解

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApp {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApp.class,args);
    }
}

3.创建application.yml中配置eureka地址

在这里插入代码片
server:
  port: 8001
spring:
  application:
    name: eurekaserver  #微服务架构,应用名称必须配置
#注册中心作用:服务注册 提供心跳续约
eureka:
  client:
    register-with-eureka: false #是否将自己注册到Eureka中
    fetch-registry: false #是否从eureka中获取服务信息
    #如果启动报错了8671端口错误
    #service-url:
    #  defaultZone: http://192.168.100.27:8001/eureka

服务注册-用户微服务+订单微服务
服务提供方
第一步引入eureka-client依赖

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

第二步:服务注册配置

eureka:
  client:
    #微服务启动后 往此配置地址注册服务信息(ip port)
    service-url:
      defaultZone: http://localhost:8001/eureka
  instance:
    #以ip地址注册到eureka注册中心
    prefer-ip-address: true
    instance-id: ${spring.application.name}:${server.port}:@project.version@   

启动顺序:先注册中心微服务-服务提供者微服务-服务消费者微服务

服务发现
第一步:根据被调用服务名获取被调用服务列表,通过负载均衡(默认轮询策略)进行http远程调用
String url = “http://test-user/user/”+orderInfo.getUserId();

第二步:开启负载均衡策略
@Bean
@LoadBalanced //开启负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}

此时我们访问EurekaServer地址http://localhost:8001/,效果如下:
在这里插入图片描述

3.2 总结
  • 搭建EurekaServer

    • 引入eureka-server依赖
    • 启动类上添加@EnableEurekaServer注解
    • 在application.yml中配置eureka地址
  • 服务注册

    • 引入eureka-client依赖
    • 在application.yml中配置eureka地址
  • 服务发现

    • 引入eureka-client依赖
    • 在application.yml中配置eureka地址
    • 给RestTemplate添加@LoadBalanced注解
    • 用服务提供者的服务名称远程调用(由原来的ip:port改服务名(spring.application.name))

注册中心之nacos

1.启动nacos服务端,可以参考添砖Java的亮哥的博客【docker的安装与使用】里面有介绍容器安装步骤

2.服务提供方添加依赖

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

3.添加配置

cloud:
    nacos:
      server-addr: 172.16.147.129:8848

访问前:http://172.16.147.129:8848/nacos 【IP根据自己的nacos服务端来填,这是我的】

在这里插入图片描述

启动服务提供者看看变化

在这里插入图片描述

多了一个服务,这个服务根据name来的,后期负载均衡就是由这个name去拉去服务列表

具体配置如下,仅供参考

server:
  port: 9001
spring:
  application:
    name: leadnews-admin
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://172.16.147.129:3306/leadnews_admin?useSSL=false&useUnicode=true&characterEncoding=UTF8&serverTimezone=Asia/Shanghai
    username: root
    password: 123456
  cloud:
    nacos:
      server-addr: 172.16.147.129:8848

# 设置Mapper接口所对应的XML文件位置,如果你在Mapper接口中有自定义方法,需要进行该配置
mybatis-plus:
  mapper-locations: classpath*:mapper/*.xml


# ======== okhttp ============
feign:
  client:
    config:
      default: # default指定的是所有的 被调用方  都设置为该配置超时时间,可以设置为某一个微服务对应的服务名
        connectTimeout: 35000 # 链接超时时间
        readTimeout: 35000 # 读取的超时时间
        loggerLevel: HEADERS #日志级别
  okhttp:
    enabled: true
  httpclient:
    enabled: false

4 负载均衡Ribbon

ribbon也是eureka的内置负载均衡组件

  • Ribbon是什么
  • 负载均衡流程讲解
  • 负载均衡算法学习
  • Ribbon负载均衡使用

Ribbon是什么?

Ribbon是Netflix发布的负载均衡器,有助于控制HTTP客户端行为。为Ribbon配置服务提供者地址列表后,Ribbon就可基于负载均衡算法,自动帮助服务消费者请求。

概念:Ribbon是基于Http协议请求的客户端负载均衡器,能实现很丰富的负载均衡算法。

场景:
注册中心微服务、多个用户微服务、1个订单微服务
页面发起根据订单id查询订单对象和用户对象请求

1.页面发起请求进入订单微服务
2.订单微服务要得到用户对象,发起http远程调用请求 http://test-user/user/用户id
3.开启Ribbon后,请求会被LoadBalancerInterceptor负载均衡拦截器拦截
4.通过RibbonLoadBanlanceClient获取url中的服务名itheima-user
5.通过DynamicServerListLoadBalnancer动态获取服务列表对象,根据服务名test-user连接eureka-server注册微服务,
得到用户微服务地址列表:192.168.100.27:28081, 192.168.100.28:18081, 192.168.100.29:38081
6.根据Ribbon负载均衡策略(ZoneAvoidanceRule 默认轮询策略)选择一个服务地址,得到一个真实http地址192.168.100.:38081
7.通过RibbonLoadBanlancerClient发送地址192.168.100.29:38081远程调用请求,调用JDK自带URLConnection(最底层对象)
8.页面就可以得到结果了

4.3 Ribbon负载均衡算法使用

Ribbon负载均衡算法的使用有2种方式

  • 代码方式: 全局,所有的服务提供提供者采用相同的负载均衡策略

    • 注册IRule接口的实现类(负载均衡算法):在test-order的启动类中添加如下负载均衡注册代码:

      /**
       * 随机负载均衡算法
       * @return
       */
      @Bean
      public IRule randomRule() {
          return new RandomRule();
      }
      
  • 配置方式 局部配置,为每个服务提供者制定不同的负载均衡策略

    • 为指定服务配置负载均衡算法:在test-order的核心配置文件中添加如下配置:

      #注意配置到跟节点
      
      #指定服务使用指定负载均衡算法
      test-user:
        ribbon:
          NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡规则
      

从懒加载 变为 饥饿加载

Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。
而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,在itheima-order的核心配置文件中,添加如下配置开启饥饿加载:

#注意配置到根节点

#饥饿加载
ribbon:
  eager-load:
    clients: itheima-user #开启饥饿加载 
    enabled: true #指定对user这个服务饥饿加载

4.4. 总结

  • Ribbon负载均衡规则

    • 规则接口是IRule
    • 默认实现是ZoneAvoidanceRule,根据zone选择服务列表,然后轮询
  • 负载均衡自定义方式

    • 代码方式:配置灵活,但修改时需要重新打包发布,全局配置
    • 配置文件方式:直观,方便,无需重新打包发布,但是无法做全局配置,指定某个提供者的负载均衡策略【推荐】
  • 饥饿加载, 拉取服务提供者的方式

    • 开启饥饿加载
    • 指定饥饿加载的微服务名称
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值