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 之中考虑到所有配置文件都暴露在远程仓库之中的安全性问题,所以提供有安全访问的处理机制,这样 ...
随机推荐
- OpenLayers点聚合
1. 引言 当页面加载的数据量过大时,拖拽.缩放时往往会产生卡顿 然而,页面实现的内容是有限的,人眼可见范围也是有限的,过于微小的部分是可以不予显示的 聚合是解决这种问题的一个办法,当数据比较多,单个 ...
- Apache HttpClient使用和源码分析
在上文中分析了 HttpURLConnection的用法,功能还是比较简单的,没有什么封装 接下来看看Apache HttpClient是如何封装httpClient的 目录 组成 请求代码 代码分析 ...
- REDIS基础要点
简述:redis 单实例,单进程,当线程处理用户请求数据,基于内存对数据处理.Redis默认分为0-16号库,每个库互相隔离(数据不共享) 基础复习: 1,系统中的每个进程对应有一个fd,通过网卡连接 ...
- chm文档生成->Sandcastle使用帮助
1.介绍 Sandcastle是微软提供的开源的,用于生成.net文档帮助的工具. 源代码路径:https://github.com/EWSoftware/SHFB,进去后能找到Relase版本的路径 ...
- RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu!
错误原因:数据有的在cpu上有的在gpu上debug:断点到出错位置查看类型,或者打印`x.is_cuda`查看修改:将cpu上的数据通过`.to(device)`加载到gpu上
- c++ 时间类型详解 time_t(转)
原文链接:https://blog.csdn.net/love_gaohz/article/details/6637625 Unix时间戳(Unix timestamp),或称Unix时间(Unix ...
- 对称加密、非对称加密 与 HTTPS
一.对称加密(Symmetric Cryptography)对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key). ...
- idea快捷的输出常用语句
sout:System.out.println(); psvm:public static void main(String[] args) {}
- PHP压缩二进制流转CSV文件
接口返回的数据是二进制流,需先BASE64解码,再进行解压缩,压缩的文件格式为ZIP,需使用Inflater进行解压,即可得到文件. java demo: 转成PHP代码: 贴上 原始二进制流数据,需 ...
- PHP Array数组
PHP中的数组实际上是一个有序映射.映射是一种把values关联到keys的类型.此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合,栈,队列 ...