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

   @Autowiredprivate 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/eurekainstance:#以ip地址注册到eureka注册中心prefer-ip-address: trueinstance-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-admindatasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://172.16.147.129:3306/leadnews_admin?useSSL=false&useUnicode=true&characterEncoding=UTF8&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456cloud: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: truehttpclient: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选择服务列表,然后轮询
  • 负载均衡自定义方式

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

    • 开启饥饿加载
    • 指定饥饿加载的微服务名称

SpringCloud的实用篇相关推荐

  1. 微服务框架springcloud(实用篇)【5】Elasticsearch 01

    一.初识elasticsearch 1.了解ES 1)elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要 ...

  2. 学习笔记:SpringCloud 微服务技术栈_实用篇②_黑马旅游案例

    若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 前言 学习视频链接 SpringCloud + RabbitMQ + Docker + Redis + 搜 ...

  3. SpringCloud实用篇01

    SpringCloud实用篇资料下载 1.认识微服务 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构.这些架构之间有怎样的差别呢? 1.0.学习目标 ...

  4. 学习笔记:SpringCloud 微服务技术栈_实用篇①_基础知识

    若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 前言 学习视频链接 SpringCloud + RabbitMQ + Docker + Redis + 搜 ...

  5. SpringBoot系统整理|运维实用篇|黑马视频

    写在前面:本博客主要是记录在学习黑马视频中遇到的问题和一些所思所想,日后忘记了,方便回顾查阅,后续遇到新的知识还会继续进行补充.本系列一共分四篇博客记录,分别是基础篇.运维实用篇.开发实用篇.原理篇. ...

  6. 黑马程序员---微服务笔记【实用篇】

    微服务技术栈导学 微服务实现流程: 所有要学的技术: 分层次教学: 具体分层: 实用篇---第一天 一.认识微服务 单体架构 将业务所有功能集中在一个项目中开发,打成一个包部署 优点:架构简单.部署成 ...

  7. SpringBoot运维实用篇

    SpringBoot2零基础到项目实战-基础篇 SpringBoot运维实用篇 从此刻开始,咱们就要进入到实用篇的学习了.实用篇是在基础篇的根基之上,补全SpringBoot的知识图谱.比如在基础篇中 ...

  8. SpringCloud 教程 | 第二篇: 服务消费者(rest+ribbon)

    转载请标明出处: blog.csdn.net/forezp/arti- 本文出自方志朋的博客 在上一篇文章,讲了服务的注册和发现.在服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于h ...

  9. springCloud - 第13篇 - 服务监控 集群模式 Hystrix-turbine

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1. 在springcloud 体系中,可以用 hystrix-dashboard  实时监控服务的 ...

最新文章

  1. Javascript中的自执行匿名函数
  2. window下启动nexus出错Unsupported major.minor version 51
  3. 使用Swashbuckle构建RESTful风格文档
  4. jenkins配置工程目录-启动case
  5. 痞子衡嵌入式:单片机AI的春天已来,ARM Cortex-M55发布了
  6. docker mysql 阿里云_阿里云docker部署mysql
  7. 关爱程序员,从产品经理做起!
  8. openstack pike版本安装笔记6(dashboard组件,控制台)
  9. Go语言实战-golang操作MySQL
  10. 分布式web系统架构图及应用架构图
  11. 配置Windows自带无线wifi热点
  12. TensorFlow的Dataset的padded_batch使用
  13. 【题解】【AcWing】1564. 哈希
  14. 【PMP】核对单和核查表的区别
  15. word怎么删除红色波浪线
  16. 首战告捷!网易有道斩获首届NLPCC中文语法错误修正比赛冠军
  17. 华为的网络模拟器eNSP
  18. 慎用!!! rm -rf 潜藏着巨大的危险!
  19. 酷讯的今天应引起创业者警醒
  20. python培训班排行榜-长沙python培训机构排名

热门文章

  1. matlab在命令行注册,在命令行窗口中输入语句
  2. 【20保研】清华大学深圳国际研究生院电子信息工程(信息技术) 2019年优秀大学生暑期夏令营通知...
  3. 隐式内联函数和显式内联函数
  4. A Game of Thrones(46)
  5. ubuntu 20.04 | 常用软件 必要配置
  6. powerquery分组,PowerQuery:如何连接分组值?
  7. 逍遥安卓能安装在虚拟服务器,逍遥安卓模拟器安装环境有哪些要求?
  8. MER:1.8万字带你系统了解宏组学实验与分析(高通量测序应用于病原体和害虫诊断——综述与实用性建议)...
  9. 「Python开发者」公号招内容编辑
  10. 搭建个人的GPS定位系统