SpringCloud-Study
SpringCloud-Study
一、微服务简介
1.单体架构和分布式架构
单体架构

分布式架构

分布式架构的问题

解决方案

小结

2.微服务
微服务技术

微服技术对比


3.SpringCloud
SpringCloud官网:https://spring.io/projects/spring-cloud

SpringCloud和SpringBoot版本兼容对照表

4.服务拆分


项目导入

案例1:根据订单id查询订单信息,并把用户信息一起返回

由于微服务之间数据独立(每个微服务都拥有自己的数据库,不能跨数据库进行查询),需要查询订单信息和用户信息

解决方案1:
订单信息再东单微服务中可以根据订单id来查询,用户信息则需要使用RestTemplate发起http请求来查询。最后将订单信息和用户信息组合并返回即可。

(1)创建RestTemplate对象,并注入到spring容器中
package cn.itcast.order;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
    /**
     * 创建RestTemplate示例,并且注入到spring容器中
     * @return
     */
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}
(2)在服务消费者的service层中注入RestTemplate,通过restTemplate来发起http请求,进行远程调用user微服务查询user信息,并将查询到的user信息组合到order信息中。
package cn.itcast.order.service;
import cn.itcast.order.mapper.OrderMapper;
import cn.itcast.order.pojo.Order;
import cn.itcast.order.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class OrderService {
    @Autowired
    private OrderMapper orderMapper;
    /**
     *注入RestTemplate
     */
    @Autowired
    private RestTemplate restTemplate;
    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        /**
         * 使用RestTemplate来发起http请求,进行远程调度查询user的信息
         */
        //通过RestTemplate来发起http请求,查询user的信息
        //拼接远程调用的url
        String url = "Http://127.0.0.1:8081/user/"+order.getUserId();
        //通过RestTemplate发起http请求,查询user信息,
        //返回的是json对象,但是可以通过设置指定类型的Class对象来将json对象转换成相应的java类型对象
        User user = restTemplate.getForObject(url, User.class);
        //将返回的user对象组合到查询到的order对象中
        order.setUser(user);
        // 4.返回
        return order;
    }
}
(3)通过order-service微服务查询订单信息,测试查询结果是否包含user信息

小结:

二、Eureka注册中心
1.服务消费者和服务提供者

2.Eureka注册中心的实现原理
解决方案1中存在问题:

Eureka注册中心如何解决以上问题:
每个微服务在启动时,都会在Eureka注册中心注册自己的信息(服务名称),并且定时向注册中心发送心跳请求,注册中心通过心跳检测机制可以将宕机的服务剔除,保证服务消费者能拉取到可使用的服务。服务消费者可以通过注册中心拉取到在注册中心注册的服务列表,获取所需的服务提供者的信息(ip、端口、接口路径、请求参数等...),再通过负载均衡算法选中某一个服务提供者,最后发送请求,进行远程调用。

小结:

3.Eureka注册中心环境搭建

搭建Eureka需要创建Eureka微服务,在工程目录中创建一个新的模块
手动搭建Eureka环境:
(1)导入Eureka的maven依赖
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

(2)在启动类中添加@EnableEurekaServer注解

(3)配置文件
在微服务中添加application.yml配置文件,设置Eureka微服务的端口,将Eireka微服务本身注册到注册中心
server:
  port: 10086 # 服务端口
spring:
  application:
    name: eurekaserver # eureka的服务名称
eureka:
  client:
    service-url:  # eureka的地址信息
      defaultZone: http://127.0.0.1:10086/eureka
通过idea搭建Eureka环境:
(1)创建新模块

(2)添加Eureka功能,springboot会自动添加Eureka服务端的maven依赖


(3)服务启动类上添加@EnableEurekaServer注解
package com.lqy.eurekaservice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer
@SpringBootApplication
public class EurekaServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServiceApplication.class, args);
    }
}

(4)添加配置application.yml文件
在微服务的application.yml配置文件文件中添加服务注册配置
server:
  port: 10087 #设置Eureka微服务的端口
spring:
  application:
    name: EurekaService  #设置微服务的名称
eureka: #配置eureka,将eureka微服务本身注册到注册中心
  client:
    service-url: #Eureka注册中心地址
      defaultZone: http://localhost:10087/eureka
(5)在Eureka中查看注册的服务
登录Eureka的地址查看微服务受否已经注册到注册中心
eureka地址:http://localhost:10087/eureka/

4.服务注册
创建一个测试微服务


(1)在微服务的pom.xml文件中添加Eureka客户端的maven配置
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
(2)在微服务的application.yml配置文件文件中添加服务注册配置
spring:
  application:
    name: OrderService  #设置微服务的名称
eureka: #配置eureka,将eureka微服务本身注册到注册中心
  client:
    service-url: #Eureka注册中心地址
      defaultZone: http://localhost:10087/eureka
(3)模拟服务集群
在idea中复制springboot服务,并修改端口配置


(4)查看微服务是否已经在Eureka注册中心注册
将添加了eureka客户端的微服务启动,访问eureka注册中心,查看微服务是否已经注册成功

小结:

5.服务发现
微服务成功注册到eureka注册中心后,服务消费者拉取注册中心的服务列表,从中获取相应的服务提供者的信息。

(1)将远程调度的地址改成服务名
(2)在服务消费者启动类为RestTemplate实例中添加@LoadBalanced注解

(3)测试:通过服务消费者的查询是否获取到服务提供者的接口并查询出结果
小结:

tip:
chorm浏览器默认返回的json对象是呈单行显示的,不方便查看。

解决方案:
1.ctrl+shift+j打开浏览器的控制台,进行查看,但是需要在控制台和浏览器主页面中进行切换,比较麻烦

2.安装一款chrom浏览器插件JSONView-for-Chrome,返回的json对象可以呈树状显示:插件下载地址
参考:https://blog.csdn.net/qq_24052051/article/details/127418888

三、Ribbon-负载均衡
1.负载均衡原理

2.负载均衡策略



修改负载均衡机制的方法:

访问不同的订单时,通过默认的负载均衡机制会轮回地选择各个user-service集群



(1)修改方法一:
针对全部微服务的负载均衡机制修改。
这里修改负载均衡机制为随机,不再是轮回选择:
在服务消费者的配置类中创建IRule实例对象并注入到spring容器中。
创建order-service微服务的配置类OrderServiceConfig.java,将之前在启动类编写的RestTemplate实例对象迁移到配置类中,实现统一管理。
package cn.itcast.order.config;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
 * 订单微服务配置类
 */
@Configuration
public class OrderServiceConfig {
    //创建RestTemplate实例对象并注入spring容器中
    /**
     * 创建RestTemplate实例,并且注入到spring容器中
     * @return
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
    //修改ribbon负载均衡机制为随机,创建一个IRule实例对象并注入spring容器中
    @Bean
    public IRule randomRule(){
        return new RandomRule();
    }
}
在order-service微服务中发送4次订单信息查询请求,发现此时负载均衡机制选择了user-service2微服务3次,选择了user-service微服务1次。实行的是随机选择,说明负载均衡机制修改成功!一般使用默认的轮回选择即可。



(2)修改方法二:
针对某个微服务的负载均衡机制修改。
在服务消费者的配置文件中添加以下配置:
UserService: #针对的服务提供者的服务名
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #设置负载均衡机制为随机选择
3.懒加载和饥饿加载
1.懒加载:第一次访问时才创建LoadBalanceClient,首次访问时耗时较长
2.饥饿加载:在项目启动时就创建LoadBalanceClient,首次访问耗时不长



可以将ribbon默认的懒加载机制修改为饥饿加载
将懒加载修改为饥饿加载:
ribbon: #修改ribbon的默认懒加载为饥饿加载
  eager-load:
    enable: true
    clients:
      -UserService #可以指定多个微服务
修改为饥饿加载后,首次访问耗时降低了:
ribbon负载均衡小结:

四、Nacos

1.Nacos安装
2.Nacos快速入门
3.Nacos的服务多级存储模型
4.NacosRule负载均衡
5.Nacos服务实例的权重设置
6.Nacos环境隔离
7.Nacos和Eureka的对比
SpringCloud-Study的更多相关文章
- SpringCloud学习之soa基础
		一.soa简单介绍 1)面向服务的架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来.SOA是解决复杂业务模块,提高扩展性,维护性,可伸缩 ... 
- 多应用下 Swagger 的使用,这可能是最好的方式!
		问题 微服务化的时代,我们整个项目工程下面都会有很多的子系统,对于每个应用都有暴露 Api 接口文档需要,这个时候我们就会想到 Swagger 这个优秀 jar 包.但是我们会遇到这样的问题,假如说我 ... 
- Nacos使用和注册部分源码介绍
		Nacos简单介绍 Nacos致力于帮助您发现.配置和管理微服务.Nacos提供了一组简单易用的特性集,帮助您快速实现动态服务发现.服务配置.服务元数据及流量管理.Nacos帮助您更敏捷和容易地构建. ... 
- SpringCloud学习之DiscoveryClient探究
		当我们使用@DiscoveryClient注解的时候,会不会有如下疑问:它为什么会进行注册服务的操作,它不是应该用作服务发现的吗?下面我们就来深入的来探究一下其源码. 一.Springframewor ... 
- SpringCloud学习之Ribbon
		一.负载均衡与Ribbon 负载均衡,在集群中是很常见的一个“名词”,顾名思义是根据一定的算法将请求分摊至对应的服务节点上,常见的算法有如下几种: 轮询法:所有请求被依次分发到每台应用服务器上,每台服 ... 
- 深入理解SpringCloud之引导程序应用上下文
		tips:我希望通过这篇文章来给对于bootstrap还不理解的朋友带来帮助.当然这篇文章不仅仅是讲解知识,我更希望给广大朋友带来学习与理解官方文档的一种思路.阅读本文前,建议大家对SpringBoo ... 
- SpringCloud的分布式配置及消息总线
		1.在搭建分布式配置时,我们大概看下分布式配置的流程 如图所示: 当一个系统中的配置文件发生改变的时候,我们需要重新启动该服务,才能使得新的配置文件生效,spring cloud config可以实现 ... 
- SpringCloud系列十二:SpringCloudSleuth(SpringCloudSleuth 简介、SpringCloudSleuth 基本配置、数据采集)
		声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:SpringCloudSleuth 2.具体内容 Sleuth 是一种提供的跟踪服务,也就是说利用 sleuth 技术 ... 
- SpringCloud系列十一:SpringCloudStream(SpringCloudStream 简介、创建消息生产者、创建消息消费者、自定义消息通道、分组与持久化、设置 RoutingKey)
		1.概念:SpringCloudStream 2.具体内容 2.1.SpringCloudStream 简介 SpringCloudStream 就是使用了基于消息系统的微服务处理架构.对于消息系统而 ... 
- SpringCloud系列十:SpringCloudConfig 高级配置(密钥加密处理(JCE)、KeyStore 加密处理、SpringCloudConfig 高可用机制、SpringCloudBus 服务总线)
		1.概念:SpringCloudConfig 高级配置 2.具体内容 在 SpringCloudConfig 之中考虑到所有配置文件都暴露在远程仓库之中的安全性问题,所以提供有安全访问的处理机制,这样 ... 
随机推荐
- Apinto 网关 V0.11.1 版本发布,多协议互转,新增编码转换器,接入 Prometheus...
			憋了那么久,Eolink 旗下 Apinto 开源网关再次更新啦~ 一起来看看是否有你期待的功能! 1.协议转换功能上线 之前发布的 Apinto v0.10.0 已经支持了多协议的基本功能,实现多协 ... 
- JUC学习笔记
			1 进程与线程:进程指正在运行的程序,进程拥有一个完整的.私有的基本运行资源集合.它有自己的内存空间.为了便于进程之间的通信,大多数操作系统都都支持进程间通信(IPC). IPC通信包括管道.消息队列 ... 
- php连接Access数据库
			最近想把一个asp的网站改成php的,无奈空间不支持mysql数据库,只好用access数据库了,但以前都是用的php+mysql,php+access数据库编程还真没有做过.感谢党,感谢cctv,感 ... 
- 域名_服务器_IP之间的关系
			目的: 近期在搞A服务器和云服务器,以及正式环境的B服务器的时候,多次搞不清楚域名,IP的关系. 现在理解看来: IP 分为内网和外网的,以A为例,A是内网的IP,然后申请下来的外网IP是B(还真忘了 ... 
- c# 在自定义类中控制form窗体中的控件 赋值或修改属性
			c# 在自定义类中控制form窗体中的控件 赋值或修改属性 首先在 自定义类 的外面 声明一个 委托模块 //声明一个委托模块 用来改变form1 窗体中的控件值 public delegate v ... 
- Deer_GF之IOS出热更包
			Hi,今天介绍一下Deer_GF_Wolong,框架基于HybridCLR热更新技术,出IOS热更包 首先我们需要准备的工作: 环境:Mac Unity 版本 2021.3.1f1c1 热更方案:Hy ... 
- vue 学习 css第四天
			一.css背景属性 可以给页面元素添加背景样式. 背景属性(background)可以设置. 1.背景颜色. 2.背景图片. 3.背景平铺. 4.背景图片位置 5.背景图像固定 1.背景颜色(back ... 
- Idea2020.2.3 创建JavaWeb项目(部署Tomcat)方法
			1.创建项目不再是Java Enterprise了,而是先New 一个普通Java项目! 2.创建项目后,选择Run->Edit Configuration->左上角加号->Tomc ... 
- 2022-05-20内部群每日三题-清辉PMP
			1.一位团队成员通知项目经理有一个问题可能会破坏项目.项目经理将该问题添加到问题日志中,并要求团队找到解决方案. 项目经理下一步应该怎么做? A.更新风险登记册 B.修订项目管理计划 C.确定适当的风 ... 
- @Target:注解的作用目标
			@Target:注解的作用目标 @Target(ElementType.TYPE)--接口.类.枚举.注解 @Target(ElementType.FIELD)--字段.枚举的常量 @Target(E ... 
