郑州市二七建设局网站,长沙装修公司排名十强,个体户 建设网站,自己搭建视频播放网站springcloud 
构建微服务项目步骤 
导入依赖编写配置文件开启这个功能 Enablexxx配置类 
于2023年2月24日下午17点38分开始学习于2023年3月17日晚上20点26分学完总结代码地址#xff1a;https://gitee.com/liang-weihao/StudySpringcloud学习笔记地址#xff1a;https://www.…springcloud 
构建微服务项目步骤 
导入依赖编写配置文件开启这个功能 Enablexxx配置类 
于2023年2月24日下午17点38分开始学习于2023年3月17日晚上20点26分学完总结代码地址https://gitee.com/liang-weihao/StudySpringcloud学习笔记地址https://www.kuangstudy.com/bbs/1374942542566551554 
简介 
SpringCloud,基于SpringBoot提供了一套微服务解决方案包括服务注册与发现配置中心全链路监控服务网关负载均衡熔断器等组件除了基于NetFlix的开源组件做高度抽象封装之外还有一些选型中立的开源组件。 
springcloud就是为了分布式通过rpc远程调用或http来互相通信访问spring boot的核心自动装配约定大于配置常用组件 
Spring cloud有哪些常用组件作用是什么? 
Eureka:注册中心Nacos:注册中心、配置中心Consul: 注册中心、配置中心Spring Cloud Config:配置中心Feign/OpenFeign:RPC调用Kong:服务网关Zuul:服务网关Spring Cloud Gateway: 服务网关Ribbon:负载均衡Spring CLoud sleuth: 链路追踪Zipkin:链路追踪Seata:分布式事务Dubbo:RPC调用Sentinel: 服务熔断Hystrix:服务熔断 
springcloud和springboot的关系 
SpringBoot专注于快速方便的开发单个个体微服务。 -JarSpringCloud是关注全局的微服务协调整理治理框架它将SpringBoot开发的一个个单体微服务整合并管理起来为各个微服务之间提供: 配置管理服务发现断路器路由微代理事件总线全局锁决策竞选分布式会话等等集成服务。SpringBoot可以离开SpringClooud独立使用开发项目但是SpringCloud离不开SpringBoot属于依赖关系SpringBoot专注于快速、方便的开发单个个体微服务SpringCloud关注全局的服务治理框架 
dubbo 
rpc框架dubbo专门的rpc远程调用 spring cloudNetflix 2018年停更  微服务就是将传统一站式根据业务拆分成一个一个服务彻底去耦合一个微服务处理一件事情微服务的优缺点 每个进程一个端口 微服务的技术栈 返回类型就是类点class 
RestTemplate远程服务调用 Autowired//返回类型url实体map返回类型ClassT responseType
private RestTemplate restTemplate;//提供多种便捷访问http服务的方法简单的restful服务模板package com.liang.springcloud.controller;import com.liang.springcloud.pojo.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.client.RestTemplate;import java.util.List;Controller
ResponseBody
public class DeptConsumerController {//理解消费者不应该有service层//RestTemplate很多方法给我们直接调用注册到spring中Autowired//返回类型url实体map返回类型ClassT responseTypeprivate RestTemplate restTemplate;//提供多种便捷访问http服务的方法简单的restful服务模板private static final String REST_URL_PREFIX  http://localhost:8001;RequestMapping(/consumer/dept/add)public boolean add(Dept dept){return restTemplate.postForObject(REST_URL_PREFIX/dept/add,dept, Boolean.class);}//http://localhost:8001/dept/list要从这个地址拿到数据RequestMapping(/consumer/dept/get/{id})public Dept get(PathVariable(id) Long id){return restTemplate.getForObject(REST_URL_PREFIX/dept/get/id,Dept.class);}RequestMapping(/consumer/dept/list)public ListDept list(){return restTemplate.getForObject(REST_URL_PREFIXdept/list, List.class);}
}Eureka服务注册与发现 
主需要在主启动类上加注解EnableEurekaServer 
SpringBootApplication
EnableEurekaServer //服务端的启动类可以接受别人注册进来
public class EurekaService_7001 {public static void main(String[] args) {SpringApplication.run(EurekaService_7001.class,args);}
}在其他服务配置文件配置好eureka配置然后在主启动类加上注解自动注册 
EnableEurekaClient//cs架构自动在服务启动后自动注册到eureka中什么是eureka 
Eureka: 怎么读? Netflix 在设计Eureka时遵循的就是AP原则 Eureka是Netflix的一个子模块也是核心模块之一。Eureka是一个基于REST的服务用于定位服务以实现云端中间层服务发现和故障转移服务注册与发现对于微服务来说是非常重要的有了服务发现与注册只需要使用服务的标识符就可以访问到服务而不需要修改服务调用的配置文件了功能类似于Dubbo的注册中心比如Zookeeper;  心跳监测机制五秒不回复证明挂掉就会把服务节点移掉  自我保护机制宁可保留全部服务也不盲目注销任何健康的服务  注意yml文件编写要空一格  搭建eureka集群对应配置文件加上绑定互联  创建三个服务端口分别为注册中心7001,7002,7003   
server:port: 7003# eureka配置
eureka:instance:hostname: eureka7003.com #Eureka服务端的实例名称client:register-with-eureka: false # 表示是否向eureka注册中心注册自己fetch-registry: false # fetch-registry 如果为false则表示自己为注册中心service-url: # 监控页面defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7001.com:7001/eureka/集群信息 把注册的提供服务8001启动就会注册到对应的服务里 server:port: 8001#mybatis的配置
mybatis:type-aliases-package: com.liang.springcloud.pojoconfig-location: classpath:mybatis/mybatis-config.xmlmapper-locations: classpath:mybatis/mapper/*.xml#spring的配置
spring:application:name: springcloud-provider-deptdatasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/db01?useUnicodetruecharacterEncodingutf-8username: rootpassword: root# Eureka的配置服务注册到哪里
eureka:client:service-url:defaultZone: http://localhost:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/instance:instance-id: springcloud-provider-dept8001-liangwh #修改的是eureka status默认的描述信息
#info配置
info:app.name: liangwh-springcloudcompany.name: liangwh123321.com 
zookeeper和eureka的区别 cap原则一个分布式系统不可能同时满足三个  作为服务注册中心Eureka比Zookeeper好在哪里?  著名的CAP理论指出一个分布式系统不可能同时满足C(一致性)、A (可用性)、P (容错性)。由于分区容错性P在分布式系统中是必须要保证的因此我们只能在A和C之间进行权衡 。Zookeeper保证的是CP; 。Eureka保证的是AP:    
ribbon负载均衡 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具轮询和随机  简单的说Ribbon是Netflix发布的开源项目主要功能是提供客户端的软件负载均衡算法将NetFlix的中间层服务连接在一起。Ribbon的客户端组件提供一系列完整的配置项如: 连接超时、重试等等。简单的说就是在配置文件中列出LoadBalancer (简称LB: 负载均衡)后面所有的机器Ribbon会自动的帮助你基于某种规则(如简单轮询随机连接等等) 去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法  负载均衡把用户的请求平摊到多个服务上达到高可用  
ribbon能干嘛? 。LB即负载均衡 (Load Balance) 在微服务或分布式集群中经常用的一种应用。 。负载均衡简单的说就是将用户的请求平摊的分配到多个服务上从而达到系统的HA(高可用) 。常见的负载均衡软件有 NginxLvs 等等 ·dubbo、 SpringCloud中均给我们提供了负载均衡SpringCloud的负载均衡算法可以自定义 。负载均衡简单分类: 集中式LB0 即在服务的消费方和提供方之间使用独立的LB设施如Nginx反向代理由该设施负责把访问请求通过某种策略转发至服务的提供方! 进程式LB将LB逻辑集成到消费方消费方从服务注册中心获知有哪些地址可用然后自己再从这些地址中选出一个合适的服务器 Ribbon就属于进程内LB它只是一个类库集成于消费方进程消费方通过它来获取到服务提供方的地址! 
注意报错 - org.springframework.beans.factory.annotation.Autowired(requiredtrue) 
表明引用的类没有注入到bean中需要在该类加上注解 Bean 
Configuration
public class ConfigBean {
//配置负载均衡实现RestTemplateBeanLoadBalanced//ribbonpublic RestTemplate getRestTemplate(){return  new RestTemplate();}
}Bean一般和Configuration一起使用  idea显示数据库  集群三个服务提供者对应三个不同的数据库通过ribbon实现负载均衡访问不同数据库轮询    
ribbon默认算法 
//ribbon 和 eureka整合以后客户端可以直接调用不用关心ip 和 端口号
//消费者主启动类
SpringBootApplication
EnableEurekaClient
//在微服务启动的时候就能去加载我们自定义的ribbon类
RibbonClient(name  SPRINGCLOUD-PROVIDER-DEPT,configuration  liangRule.class)
public class DeptConsumer_88 {public static void main(String[] args) {SpringApplication.run(DeptConsumer_88.class, args);}}注意自定义类要在主启动类上一级  
package com.liang.myrule;
import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;import java.util.List;
import java.util.concurrent.ThreadLocalRandom;public class LiangRandomRule extends AbstractLoadBalancerRule {//每个服务访问6次换下一个服务3个//total0默认0如果6指向下一个服务节点//index 0,默认0如果total  5index1private  int total  0; //被调用的次数private int currentIndex  0; //当前谁提供的服务SuppressWarnings({RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE})public Server choose(ILoadBalancer lb, Object key) {if (lb  null) {return null;} else {Server server  null;while(server  null) {if (Thread.interrupted()) {return null;}ListServer upList  lb.getReachableServers();//获得可访问服务器ListServer allList  lb.getAllServers();//获取全部服务int serverCount  allList.size();if (serverCount  0) {return null;}//                int index  this.chooseRandomInt(serverCount);//生成区间随机数
//                server  (Server)upList.get(index);//从活着的服务中随机获取一个// -自定义算法开始if (total5){server  upList.get(currentIndex);total;}else {total  0;currentIndex ;if (currentIndexupList.size()){currentIndex  0;}server  upList.get(currentIndex);//从活着的服务中获得指定的服务来操作}// -自定义算法结束if (server  null) {Thread.yield();} else {if (server.isAlive()) {return server;}server  null;Thread.yield();}}return server;}}protected int chooseRandomInt(int serverCount) {return ThreadLocalRandom.current().nextInt(serverCount);}public Server choose(Object key) {return this.choose(this.getLoadBalancer(), key);}public void initWithNiwsConfig(IClientConfig clientConfig) {}
} 
Configuration
public class liangRule {Beanpublic IRule myRule(){return new LiangRandomRule();//默认是轮询现在我们自定义访问自己定义的算法}
}Feign负载均衡 
简介 
feign是声明式的web service客户端它让微服务之间的调用变得更简单了类似controller调用service。SpringCloud集成了Ribbon和Eureka可在使用Feign时提供负载均衡的http客户端。 只需要创建一个接口然后添加注解即可! feign 主要是社区大家都习惯面向接口编程。这个是很多开发人员的规范。调用微服务访问两种方法 1.微服务名字 (ribbon] 2.接口和注解 [feign ]主要靠接口和注解就可以使用 
在service加上注解 
FeignClient(value  SPRINGCLOUD-PROVIDER-DEPT)接口 
Component//注入到容器
FeignClient(value  SPRINGCLOUD-PROVIDER-DEPT)
public interface DeptClientService {GetMapping(/dept/get/{id})public Dept queryById(PathVariable(id)Long id);GetMapping(/dept/list)public ListDept queryAll();PostMapping(/dept/add)public boolean addDept(Dept dept);
} 
controller 层 
RestController
public class DeptConsumerController {//理解消费者不应该有service层//RestTemplate很多方法给我们直接调用注册到spring中Autowired//返回类型url实体map返回类型ClassT responseTypeprivate RestTemplate restTemplate;//提供多种便捷访问http服务的方法简单的restful服务模板//ribbon负载均衡 我们这里的地址应该是一个变量通过服务访问
//    private static final String REST_URL_PREFIX  http://localhost:8001;
//    private static final String REST_URL_PREFIX  http://SPRINGCLOUD-PROVIDER-DEPT;Autowiredprivate DeptClientService deptClientService;RequestMapping(/consumer/dept/add)public boolean add(Dept dept){return this.deptClientService.addDept(dept);}//http://localhost:8001/dept/list要从这个地址拿到数据RequestMapping(/consumer/dept/get/{id})public Dept get(PathVariable(id) Long id){return deptClientService.queryById(id);}RequestMapping(/consumer/dept/list)public ListDept list(){return this.deptClientService.queryAll();}主启动类 
SpringBootApplication
EnableEurekaClient
EnableFeignClients(basePackages  {com.liang.springcloud})
public class FeignDeptConsumer_88 {public static void main(String[] args) {SpringApplication.run(FeignDeptConsumer_88.class, args);}}Hystrix服务熔断降级 
简介 
Hvstrix是一个用于处理分布式系统的延迟和容错的开源库在分布式系统里许多依赖不可避免的会调用失败比如超时异常等Hystrix能够保证在一个依赖出问题的情况下不会导致整体服务失败避免级联故障以提高分布式系统的弹性。 断路器本身是一种开关装置当某个服务单元发生故障之后通过断路器的故障监控(类似熔断保险丝)向调用方返回一个服务预期的可处理的备选响应(FallBack)而不是长时间的等待或者抛出调用方法无法处理的异常这样就可以保证了服务调用方的线程不会被长时间不必要的占用从而避免了故喷在分布式系统中的蔓延乃至雪崩 
Hystrix能干嘛 
。服务降级 。服务熔断 。服务限流 。接近实时的监控 
服务雪崩 ‘弃车保帅’ 
服务熔断 
服务熔断是什么 熔断机制是对应雪崩效应的一种微服务链路保护机制 当扇出链路的某个微服务不可用或者响应时间太长时会进行服务的降级进而熔断该节点微服务的调用快速返回 错误的响应信息。当检测到该节点微服务调用响应正常后恢复调用链路。在Springloud框架里熔断机制通过Hystrix实现。Hvstrix会监控微服务间调用的状况当失败的调用到一定闻值5秒内20次调用失败就会启动熔断机制。 熔断机制的注解是 HystrixCommand。  在主启动类加上注解EnableCircuitBreaker//添加对熔断的支持  链式编程注解在对应实体类加上即可  
Accessors(chain  true)//链式写法	
Data
NoArgsConstructor
Accessors(chain  true)//链式写法
public class Dept implements Serializable {private Long deptno;//主键private String dname;private String db_source;//一个服务对应一个数据库数据库存的字段public Dept(String dname) {this.dname  dname;}
}写法 //备选方法GetMapping(/dept/get/{id})public Dept hystrixGet(PathVariable(id) Long id){return  new Dept().setDeptno(id).setDname(idid没有对应信息nullhystrix).setDb_source(no this database in mysql);}hystrix服务熔断调用其他方法 GetMapping(/dept/get/{id})HystrixCommand(fallbackMethod  hystrixGet)//只要失败就调用其他方法public Dept get(PathVariable(id) Long id){Dept dept  deptService.queryById(id);if (dept  null){throw  new RuntimeException(idid不存在这个id);}return  dept;}//备选方法public Dept hystrixGet(PathVariable(id) Long id){return  new Dept().setDeptno(id).setDname(idid没有对应信息nullhystrix).setDb_source(no this database in mysql);} 服务降级 
先开启eureka注册中心7001再开启服务提供者8001最后开启消费者88然后把8001提供者挂掉降级就会默认返回自定义信息而不是直接访问不到数据库 对应消费者配置文件加上降级 
#开启降级 feign.hystrix
feign:hystrix:enabled: trueComponent//注入到容器
FeignClient(value  SPRINGCLOUD-PROVIDER-DEPT,fallbackFactory  DeptClientServiceFactory.class)
public interface DeptClientService {GetMapping(/dept/get/{id})public Dept queryById(PathVariable(id)Long id);GetMapping(/dept/list)public ListDept queryAll();PostMapping(/dept/add)public boolean addDept(Dept dept);
}//降级~
Component
public class DeptClientServiceFactory implements FallbackFactory {Overridepublic DeptClientService create(Throwable throwable) {return new DeptClientService() {Overridepublic Dept queryById(Long id) {return new Dept().setDeptno(id).setDname(idid没有对应的信息客户端提供了降级的信息这个服务现在已经被关闭).setDb_source(no数据);}}总结 服务熔断 服务端某个服务超时或者异常引起熔断  服务降级 客户端 从整体网站请求负载考虑当某个服务熔断关闭之后服务将不被调用服务就不被调用可以在客户端自定义回调fallbackFactory返回一个默认值整体服务下降但是能用比挂掉强 dashboard监控 在主启动类加上注解EnableHystrixDashboard //开启配置好端口  直接访问  填写监测路径 去对应的请求刷新这边监测页面会对应刷新  绿色代表健康红色危险 
Zuul路由网关 
概述 什么是Zuul? Zuul包含了对请求的路由和过滤两个最主要的功能! 其中路由功能负责将外部请求转发到具体的微服务实例上是实现外部访问统一入口的基础而过滤器功能则负责对请求的处理过程进行干预是实现请求校验服务聚合等功能的基础。Zuul和Eureka进行整合将Zuul自身注册为Eureka服务治理下的应用同时从Eureka中获得其他微服务的消息也即以后的访问微服务都是通过Zuul跳转后获得 注意: Zuul服务最终还是会注册进Eureka 提供:代理  路由  过滤 三大功能! Zuul能干嘛?  路由  过滤  主启动类加上注解EnableZuulProxy //zuul启动  访问地址http://www.liangstudy.com:9527/springcloud-provider-dept/dept/get/1 zuul:routes:mydept.serviceId: springcloud-provider-dept  # 配置自定义路径mydept.path: /mydept/**ignored-services: *  # 忽略全部#ignored-services: springcloud-provider-dept  #不能再使用这个路径访问prefix: /liang #设置访问公共的前缀http://www.liangstudy.com:9527/mydept/dept/get/1  http://www.liangstudy.com:9527/liang/mydept/dept/get/1  
config配置中心 
概述 分布式系统面临的–配置文件的问题 微服务意味着要将单体应用中的业务拆分成一个个子服务每个服务的粒度相对较小因此系统中会出现大量的服务由于每个服务都需要必要的配置信息才能运行所以一套集中式的动态的配置管理设施是必不可少的。SpringCloud提供了ConfigServer来解决这个问题我们每一个微服务自己带着一个application.yml那上百的的配置文件要修改起来岂不是要发疯!  Spring loud Config 为微服务架构中的微服务提供集中化的外部配置支持配置服务器为各个不同微服务应用的所有环节提供了一个中心化的外部配置。  springc config 分为服务端和客户端两部分  
Springcloud config分布式配置中心能干嘛 。集中管理配置文件 。不同环境不同配置动态化的配置更新分环境部署比如 /dev /test/ /prod /beta /release 
。运行期间动态调整配置不再需要在每个服务部署的机器上编写配置文件服务会向配置中心统一拉取配置自己的信息。 。当配置发生变动时服务不需要重启即可感知到配置的变化并应用新的配置0 。将配置信息以REST接口的形式暴露 
Git clone代码的时候 下用ssh需要公钥秘钥报错的时候就用https得clone  
Git Git add .添加到本地仓库  Git status 查看当前文件的提交状态  Git commit -m ‘描述信息’ 提交到本地暂存区  Git push上传到远程服务器  修改git的配置 $ git config --global user.email 1814356884qq.com$ git config --list$ git config --global user.name liangweihao  主启动类加上注解EnableConfigServer  访问路径http://localhost:3344/application-dev.yml  记得把Git仓库设为开源公开状态   客户端拿服务端的代码  拼接    毕业啦