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的更多相关文章

  1. SpringCloud学习之soa基础

    一.soa简单介绍 1)面向服务的架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来.SOA是解决复杂业务模块,提高扩展性,维护性,可伸缩 ...

  2. 多应用下 Swagger 的使用,这可能是最好的方式!

    问题 微服务化的时代,我们整个项目工程下面都会有很多的子系统,对于每个应用都有暴露 Api 接口文档需要,这个时候我们就会想到 Swagger 这个优秀 jar 包.但是我们会遇到这样的问题,假如说我 ...

  3. Nacos使用和注册部分源码介绍

    Nacos简单介绍 Nacos致力于帮助您发现.配置和管理微服务.Nacos提供了一组简单易用的特性集,帮助您快速实现动态服务发现.服务配置.服务元数据及流量管理.Nacos帮助您更敏捷和容易地构建. ...

  4. SpringCloud学习之DiscoveryClient探究

    当我们使用@DiscoveryClient注解的时候,会不会有如下疑问:它为什么会进行注册服务的操作,它不是应该用作服务发现的吗?下面我们就来深入的来探究一下其源码. 一.Springframewor ...

  5. SpringCloud学习之Ribbon

    一.负载均衡与Ribbon 负载均衡,在集群中是很常见的一个“名词”,顾名思义是根据一定的算法将请求分摊至对应的服务节点上,常见的算法有如下几种: 轮询法:所有请求被依次分发到每台应用服务器上,每台服 ...

  6. 深入理解SpringCloud之引导程序应用上下文

    tips:我希望通过这篇文章来给对于bootstrap还不理解的朋友带来帮助.当然这篇文章不仅仅是讲解知识,我更希望给广大朋友带来学习与理解官方文档的一种思路.阅读本文前,建议大家对SpringBoo ...

  7. SpringCloud的分布式配置及消息总线

    1.在搭建分布式配置时,我们大概看下分布式配置的流程 如图所示: 当一个系统中的配置文件发生改变的时候,我们需要重新启动该服务,才能使得新的配置文件生效,spring cloud config可以实现 ...

  8. SpringCloud系列十二:SpringCloudSleuth(SpringCloudSleuth 简介、SpringCloudSleuth 基本配置、数据采集)

    声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:SpringCloudSleuth 2.具体内容 Sleuth 是一种提供的跟踪服务,也就是说利用 sleuth 技术 ...

  9. SpringCloud系列十一:SpringCloudStream(SpringCloudStream 简介、创建消息生产者、创建消息消费者、自定义消息通道、分组与持久化、设置 RoutingKey)

    1.概念:SpringCloudStream 2.具体内容 2.1.SpringCloudStream 简介 SpringCloudStream 就是使用了基于消息系统的微服务处理架构.对于消息系统而 ...

  10. SpringCloud系列十:SpringCloudConfig 高级配置(密钥加密处理(JCE)、KeyStore 加密处理、SpringCloudConfig 高可用机制、SpringCloudBus 服务总线)

    1.概念:SpringCloudConfig 高级配置 2.具体内容 在 SpringCloudConfig 之中考虑到所有配置文件都暴露在远程仓库之中的安全性问题,所以提供有安全访问的处理机制,这样 ...

随机推荐

  1. OpenLayers点聚合

    1. 引言 当页面加载的数据量过大时,拖拽.缩放时往往会产生卡顿 然而,页面实现的内容是有限的,人眼可见范围也是有限的,过于微小的部分是可以不予显示的 聚合是解决这种问题的一个办法,当数据比较多,单个 ...

  2. Apache HttpClient使用和源码分析

    在上文中分析了 HttpURLConnection的用法,功能还是比较简单的,没有什么封装 接下来看看Apache HttpClient是如何封装httpClient的 目录 组成 请求代码 代码分析 ...

  3. REDIS基础要点

    简述:redis 单实例,单进程,当线程处理用户请求数据,基于内存对数据处理.Redis默认分为0-16号库,每个库互相隔离(数据不共享) 基础复习: 1,系统中的每个进程对应有一个fd,通过网卡连接 ...

  4. chm文档生成->Sandcastle使用帮助

    1.介绍 Sandcastle是微软提供的开源的,用于生成.net文档帮助的工具. 源代码路径:https://github.com/EWSoftware/SHFB,进去后能找到Relase版本的路径 ...

  5. 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上

  6. c++ 时间类型详解 time_t(转)

    原文链接:https://blog.csdn.net/love_gaohz/article/details/6637625 Unix时间戳(Unix timestamp),或称Unix时间(Unix ...

  7. 对称加密、非对称加密 与 HTTPS

    一.对称加密(Symmetric Cryptography)对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key). ...

  8. idea快捷的输出常用语句

    sout:System.out.println(); psvm:public static void main(String[] args) {}

  9. PHP压缩二进制流转CSV文件

    接口返回的数据是二进制流,需先BASE64解码,再进行解压缩,压缩的文件格式为ZIP,需使用Inflater进行解压,即可得到文件. java demo: 转成PHP代码: 贴上 原始二进制流数据,需 ...

  10. PHP Array数组

    PHP中的数组实际上是一个有序映射.映射是一种把values关联到keys的类型.此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合,栈,队列 ...