当前位置: 首页 > news >正文

网站建设策划书的编制电子商务网站建设需要注意什么

网站建设策划书的编制,电子商务网站建设需要注意什么,昆明建设局官方网站,wordpress换域名和空间文章目录Spring Cloud快速入门一、基础概念1、微服务架构2、微服务技术栈3、什么是Spring Cloud?4、Spring Cloud和Spring Boot的联系#xff1f;5、比较成熟的互联网架构二、Rest环境搭建1、搭建提供者1.1、创建一个父工程1.2、创建一个springcloud-api模块1.3、创建一个spr… 文章目录Spring Cloud快速入门一、基础概念1、微服务架构2、微服务技术栈3、什么是Spring Cloud?4、Spring Cloud和Spring Boot的联系5、比较成熟的互联网架构二、Rest环境搭建1、搭建提供者1.1、创建一个父工程1.2、创建一个springcloud-api模块1.3、创建一个springcloud-provider-dept-80012、搭建消费者3、总结三、Eureka服务注册与发现1、什么是Eureka2、原理3、三大角色4、搭建EurekaService端5、搭建EurekaClient6、自我保护机制7、集群配置8、对比Zookeeper8.1、CAP原则8.2、作为服务注册中心Eureka比Zookeeper好在哪里?四、Ribbon1、什么是ribbon2、Ribbon能干嘛3、使用Ribbon4、负载均衡算法五、Feign1、简介2、Feign能干什么?3、使用Feign六、Hystrix服务熔断1、服务雪崩2、什么是Hystrix3、服务熔断Demo4、服务降级Demo4.1、Feign风格4.2、RestTemplate风格5、Dashboard流监控七、Zuul1、什么是zuul2、Demo八、Config分布式配置1、分布式系统面临的--配置文件的问题2、SpringCloud config分布式配置中心能干嘛3、配置Git4、Server连接Git配置5、客户端连接服务端6、测试Spring Cloud快速入门 一、基础概念 1、微服务架构 微服务架构4个核心问题 服务很多客户端该怎么访问这么多服务服务之间如何通信这么多服务如何治理服务挂了怎么办 解决方案 Spring Cloud 生态 SpringBoot Spring Cloud NetFlix一站式解决方案 API网关zuul组件通信Feign —HttpClient— Http的通讯方式同步阻塞服务器注册发现Eureka熔断机制Hystrix Apache Dubbo Zookeeper半自动需要整合别人的异步RPC API没有找第三方组件zuul或者自己实现通信Dubbo服务器注册发现Zookeeper熔断机制借助别人的 Dubbo这个方案并不完善。。。。 Spring Cloud Alibaba一站式解决方案更简单了 新概念服务网格~Server 2、微服务技术栈 3、什么是Spring Cloud? SpringCloud,基于SpringBoot提供了一套微服务解决方案包括服务注册与发现配置中心全链路监控服务网关负载均衡熔断器等组件除了基于NetFlix的开源组件做高度抽象封装之外还有一些选型中立的开源组件SpringCloud利用SpringBoot的开发便利性巧妙地简化了分布式系统基础设施的开发SpringCloud为开发人员提供了快速构建分布式系统的一些工具包括配置管理服务发现断路器路由微代理事件总线全局锁决策竟选分布式会话等等他们都可以用SpringBoot的开发风格做到一键启动和部署。SpringBoot并没有重复造轮子它只是将目前各家公司开发的比较成熟经得起实际考研的服务框架组合起来通过SpringBoot风格进行再封装屏蔽掉了复杂的配置和实现原理最终给开发者留出了一套简单易懂易部署和易维护的分布式系统开发工具包SpringCloud 是 分布式微服务架构下的一站式解决方案是各个微服务架构落地技术的集合体俗称微服务全家桶 4、Spring Cloud和Spring Boot的联系 SpringBoot专注于快速方便的开发单个个体微服务。SpringCloud是关注全局的微服务协调整理治理框架它将SpringBoot开发的一个个单体微服务整合并管理起来为各个微服务之间提供: 配置管理服务发现断路器路由微代理事件总线全局锁决策竞选分布式会话等等集成服务SpringBoot可以离开SpringCloud独立使用开发项目但是SpringCloud离不开SpringBoot属于依赖关系SpringBoot专注于快速、方便的开发单个个体微服务SpringCloud关注全局的服务治理框架 5、比较成熟的互联网架构 二、Rest环境搭建 1、搭建提供者 1.1、创建一个父工程 pom.xml 配置打包方式pom !--打包方式-- packagingpom/packaging配置坐标 propertiesmaven.compiler.source8/maven.compiler.sourcemaven.compiler.target8/maven.compiler.targetproject.build.sourceEncodingUTF-8/project.build.sourceEncodingjunit.version4.12/junit.versionlog4j.version1.2.17/log4j.versionlombok.version1.16.18/lombok.version /propertiesdependencyManagementdependencies!--springcloud依赖--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-dependencies/artifactIdversionGreenwich.SR1/versiontypepom/typescopeimport/scope/dependency!--springboot依赖--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-dependencies/artifactIdversion2.1.4.RELEASE/versiontypepom/typescopeimport/scope/dependency!--数据库--!--mysql驱动--dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.32/version/dependency!--druid--dependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactIdversion1.2.16/version/dependency!--mybaits-plus--dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.5.2/version/dependency!--日志和测试--!--junit--dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion${junit.version}/version/dependency!--lombok--dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion${lombok.version}/version/dependency!--log4j--dependencygroupIdlog4j/groupIdartifactIdlog4j/artifactIdversion${log4j.version}/version/dependency!--logback-core--dependencygroupIdch.qos.logback/groupIdartifactIdlogback-core/artifactIdversion1.2.3/version/dependency/dependencies /dependencyManagement1.2、创建一个springcloud-api模块 添加坐标 dependencies!--当前Module自己需要的依赖如果父依赖中配置了版本这里直接引入即可--dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependency /dependencies数据库 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------------------------- -- Table structure for dept -- ---------------------------- DROP TABLE IF EXISTS dept; CREATE TABLE dept (deptno bigint(0) NOT NULL AUTO_INCREMENT,dname varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,db_source varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,PRIMARY KEY (deptno) USING BTREE ) ENGINE InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci ROW_FORMAT Dynamic;SET FOREIGN_KEY_CHECKS 1;insert into dept(dname, db_source) values(开发部, DATABASE()); insert into dept(dname, db_source) values(人事部, DATABASE()); insert into dept(dname, db_source) values(财务部, DATABASE()); insert into dept(dname, db_source) values(市场部, DATABASE()); insert into dept(dname, db_source) values(运维部, DATABASE());pojo Data NoArgsConstructor public class Dept implements Serializable { // Dept 实体类 orm 类表关系映射// 主键private Long deptno;private String dname;// 这个数据存在在哪个数据库的字段~微服务一个服务对应一个数据库同一个信息被存在不同的数据库private String dbSource;public Dept(String dname){this.dname dname;} }1.3、创建一个springcloud-provider-dept-8001 坐标 dependenciesdependency!--我们需要拿到实体类所以要配置api moudle--groupIdcom.lzy/groupIdartifactIdspringcloud-api/artifactIdversion1.0-SNAPSHOT/version/dependency!--junit--dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdscopelzy.springcloud.test/scope/dependency!--数据库--dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactId/dependencydependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactId/dependencydependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactId/dependencydependencygroupIdch.qos.logback/groupIdartifactIdlogback-core/artifactId/dependency!--web--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!--jetty--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-jetty/artifactId/dependency!--热部署--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactId/dependency /dependenciesapplication.yaml server:port: 8001 #mybaits-plus mybatis-plus:configuration:map-underscore-to-camel-case: truelog-impl: org.apache.ibatis.logging.stdout.StdOutImplglobal-config:db-config:id-type: ASSIGN_IDtype-aliases-package: com.lzy.springcloud.pojo#spring的配置 spring:application:name: springcloud-provider-deptdatasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/db01?useUnicodetruecharacterEncodingutf-8serverTimezoneAsia/ShanghaiuseSSLfalseusername: rootpassword: lige0612mapper service public interface DeptService extends IServiceDept { }Service public class DeptServiceImpl extends ServiceImplDeptMapper, Dept implements DeptService { }controller // 提供Resultful服务 RestController RequestMapping(/dept) public class DeptController {Autowiredprivate DeptService deptService;PostMapping(/add)public boolean addDept(RequestBody Dept dept){return deptService.save(dept);}GetMapping(/get/{id})public Dept get(PathVariable(id) Long id){LambdaQueryWrapperDept lqw new LambdaQueryWrapper();lqw.eq(Dept::getDeptno, id);return deptService.getOne(lqw);}GetMapping(/list)public ListDept list(){return deptService.list();} }主启动器 SpringBootApplication public class DeptProvider_8001 {public static void main(String[] args) {SpringApplication.run(DeptProvider_8001 .class, args);} }然后可以启动一下试一试接口能不能正常工作注意是get还是post请求 2、搭建消费者 创建springcloud-consumer-dept-80 坐标 dependencies!--实体类--dependencygroupIdcom.lzy/groupIdartifactIdspringcloud-api/artifactIdversion1.0-SNAPSHOT/version/dependency!--web--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactId/dependency /dependenciesapplication.yaml server:port: 80Config Configuration public class ConfigBean {Beanpublic RestTemplate getRestTemplate(){return new RestTemplate();} }controller RestController RequestMapping(/consumer/dept) public class DeptConsumerController {// 消费者不应该有service层~// RestTemplate..供我们直接调用Autowiredprivate RestTemplate restTemplate;// 固定前缀private static final String REST_URL_PREFIX http://localhost:8001;GetMapping(/get/{id})public Dept get(PathVariable(id) Long id){return restTemplate.getForObject(REST_URL_PREFIX /dept/get/ id, Dept.class);}PostMapping(/add)public boolean add(Dept dept){return Boolean.TRUE.equals(restTemplate.postForObject(REST_URL_PREFIX /dept/add, dept, Boolean.class));}GetMapping(/list)public List list(){return restTemplate.getForObject(REST_URL_PREFIX /dept/list, List.class);} }主启动器 SpringBootApplication public class DeptConsumer_80 {public static void main(String[] args) {SpringApplication.run(DeptConsumer_80.class, args);} }3、总结 这里我们可以发现整个代码就很干净耦合度很低可扩展性强易维护api中提供实体类provider中提供服务也就是server什么的东西consumer中就只是负责消费调用provider中的东西中间的通信目前采用的是Resultful风格的RestTemplate相对于之前用的ZookeeperDubbo方式更加简洁一些 三、Eureka服务注册与发现 1、什么是Eureka Netflix 在设计Eureka时遵循的就是AP原则Eureka是Netflix的一个子模块也是核心模块之一。Eureka是一个基于REST的服务用于定位服务以实现云端中间层服务发现和故障转移服务注册与发现对于微服务来说是非常重要的有了服务发现与注册只需要使用服务的标识符就可以访问到服务而不需要修改服务调用的配置文件了功能类似于Dubbo的注册中心比如Zookeeper; 2、原理 SpringCloud 封装了NetFlix公司开发的Eureka模块来实现服务注册和发现 (对比Zookeeper)。Eureka采用了C-S的架构设计EurekaServer 作为服务注册功能的服务器他是服务注册中心而系统中的其他微服务。使用Eureka的客户端连接到EurekaServer并维持心跳连接。这样系统的维护人员就可以通过EurekaServer来监控系统中各个微服务是否正常运行SpringCloud的一些其他模块 (比如Zuul) 就可以通过EurekaServer来发现系统中的其他微服务并执行相关的逻辑;Eureka 包含两个组件: Eureka Server 和 Eureka ClientEureka Server提供服务注册服务各个节点启动后会在EurekaServer中进行注册这样Eureka Server中的服务注册表中将会村粗所有可用服务节点的信息服务节点的信息可以在界面中直观的看到。Eureka Client是一个ava客户端用于简化EurekaServer的交互客户端同时也具备一个内置的使用轮询负载算法的负载均衡器。在应用启动后将会向EurekaServer发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳EurekaServer将会从服务注册表中把这个服务节点移除掉 (默认周期为90秒) 3、三大角色 Eureka Server: 提供服务的注册于发现。zookeeperService Provider: 将自身服务注册到Eureka中从而使消费方能够找到。Service Consumer: 服务消费方从Eureka中获取注册服务列表从而找到消费服务。 4、搭建EurekaService端 创建springcloud-eureka-7001 坐标 dependencies!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka-server --dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-eureka-server/artifactIdversion1.4.6.RELEASE/version/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactId/dependency /dependenciesapplication.yaml server:port: 7001 # EurekaService_7001 eureka:instance:hostname: localhost #Eureka服务端的实例名字client:register-with-eureka: false # 表示是否向Eureka注册中心注册自己fetch-registry: false # fetch-registry如果为false则表示自己为注册中心service-url: # 监控页面~defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/5、搭建EurekaClient 在provider中配置 坐标 !--Eureka-- !-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka -- dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-eureka/artifactIdversion1.4.6.RELEASE/version /dependencyapplication.yaml # Eureka的配置服务注册到哪里 eureka:client:service-url:defaultZone: http://localhost:7001/eureka/主启动器 加上 EnableEurekaClient 注解 这样将server端和client端启动起来访问localhost:7001 就会看到下面注册信息 然后有点小配置 # Eureka的配置服务注册到哪里 eureka:client:service-url:defaultZone: http://localhost:7001/eureka/instance:instance-id: springcloud-provider-dept-8001 # 修改Eureka上面的默认描述信息 # info配置 info:app.name: lzycompany.name: blog.lzy.com!--完善监控信息-- dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId /dependency这样你点击默认描述信息那里就会看到下面 查看注册的一些信息 在controller中能看别的方式估计也可以 // 获取一些配置的信息得到具体的微服务 Autowired private DiscoveryClient discoveryClient;GetMapping(/info) public Object discovery(){// 获取微服务列表的清单ListString services discoveryClient.getServices();System.out.println(Discovery services services);// 得到一个具体的微服务信息通过微服务的获取到信息ListServiceInstance instances discoveryClient.getInstances(SPRINGCLOUD-PROVIDER-DEPT);for (ServiceInstance instance : instances) {System.out.println(instance.getHost() \t instance.getPort() \t instance.getUri() \t instance.getServiceId());}return this.discoveryClient; }主启动器中加EnableEurekaClient注解 当访问的时候就可以打印出消息了 6、自我保护机制 一句话总结: 某时刻某一个微服务不可以用了eureka不会立刻清理依旧会对该微服务的信息进行保存! 默认情况下如果EurekaServer在一定时间内没有接收到某个微服务实例的心跳EurekaServer将会注销该实例(默认90秒)。但是当网络分区故障发生时微服务与Eureka之间无法正常通行以上行为可能变得非常危险了因为微服务本身其实是健康的此时本不应该注销这个服务。Eureka通过 自我保护机制来解决这个问题–当EurekaServer节点在短时间内丢失过多客户端时(可能发生了网络分区故障)那么这个节点就会进入自我保护模式。一旦进入该模式EurekaServer就会保护服务注册表中的信息不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后该EurekaServer节点会自动退出自我保护模式。在自我保护模式中EurekaServer会保护服务注册表中的信息不再注销任何服务实例。当它收到的心跳数重新恢复到闻值以上时该EurekaServer节点就会自动退出自我保护模式。它的设计哲学就是宁可保留错误的服务注册信息也不盲目注销任何可能健康的服务实例。一句话: 好死不如赖活着综上自我保护模式是一种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留)也不盲目注销任何健康的微服务。使用自我保护模式可以让Eureka集群更加的健壮和稳定在SpringCloud中可以使用eureka.server.enable-self-preservation false 禁用自我保护模式[不推荐关闭自我保护机制] 7、集群配置 搭建三个Eureka服务复制改一改就可以了 修改hosts文件 配置集群 7001 server:port: 7001 # EurekaService_7001 eureka:instance:hostname: eureka7001 #Eureka服务端的实例名字client:register-with-eureka: false # 表示是否向Eureka注册中心注册自己fetch-registry: false # fetch-registry如果为false则表示自己为注册中心service-url: # 监控页面~# 单机# defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/# 集群defaultZone: http://eureka7002:7002/eureka/, http://eureka7003:7003/eureka/7002 server:port: 7002 # EurekaService_7001 eureka:instance:hostname: eureka7002 #Eureka服务端的实例名字client:register-with-eureka: false # 表示是否向Eureka注册中心注册自己fetch-registry: false # fetch-registry如果为false则表示自己为注册中心service-url: # 监控页面~# 单机# defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/# 集群defaultZone: http://eureka7001:7001/eureka/, http://eureka7003:7003/eureka/7003 server:port: 7003 # EurekaService_7001 eureka:instance:hostname: eureka7003 #Eureka服务端的实例名字client:register-with-eureka: false # 表示是否向Eureka注册中心注册自己fetch-registry: false # fetch-registry如果为false则表示自己为注册中心service-url: # 监控页面~# 单机# defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/# 集群defaultZone: http://eureka7001:7001/eureka/, http://eureka7002:7002/eureka/配置服务端 server:port: 8001 #mybaits-plus mybatis-plus:configuration:map-underscore-to-camel-case: truelog-impl: org.apache.ibatis.logging.stdout.StdOutImplglobal-config:db-config:id-type: ASSIGN_IDtype-aliases-package: com.lzy.springcloud.pojo#spring的配置 spring:application:name: springcloud-provider-deptdatasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/db01?useUnicodetruecharacterEncodingutf-8serverTimezoneAsia/ShanghaiuseSSLfalseusername: rootpassword: lige0612# Eureka的配置服务注册到哪里 eureka:client:service-url:defaultZone: # 集群 http://eureka7001:7001/eureka/,http://eureka7002:7002/eureka/,http://eureka7003:7003/eureka/instance:instance-id: springcloud-provider-dept-8001 # 修改Eureka上面的默认描述信息 # info配置 info:app.name: lzycompany.name: blog.lzy.com将项目都启动起来访问各自的监控页面ok 8、对比Zookeeper 8.1、CAP原则 CConsistency强一致性AAvailablity可用性PPartition tolerance分区容错性 8.2、作为服务注册中心Eureka比Zookeeper好在哪里? 著名的CAP理论指出一个分布式系统不可能同时满足C (一致性)、A (可用性)、P (容错性)由于分区容错性P在分布式系统中是必须要保证的因此我们只能在A和C之间进行权衡 Zookeeper保证的是CPEureka保证的是AP Zookeeper保证的是CP        当向注册中心查询服务列表时我们可以容忍注册中心返回的是几分钟以前的注册信息但不能接受服务直接down掉不可用。也就是说服务注册功能对可用性的要求要高于一致性。但是zk会出现这样一种情况当mastel节点因为网络故障与其他节点失去联系时剩杀节点会重新进行leader选举。问题在于选举leader的时间太长30~120S且选举期间整个zk集群都是不可用的这就导致在选举期间注册服务瘫痪。在云部署的环境下因为网络问题使得zk集群失去master节点是较大概率会发生的事件虽然服务最终能够恢复但是漫长的选举时间导致的注册长期不可用是不能容忍的。 Eureka保证的是AP        Eureka看明白了这一点因此在设计时就优先保证可用性。Eureka各个节点都是平等的几个节点挂掉不会影响正常节点的工作剩余的节点依然可以提供注册和查询服务。而Eureka的客户端在向某个Eureka注册时如果发现连接失败则会自动切换至其他节点只要有一台Eureka还在就能保住注册服务的可用性只不过查到的信息可能不是最新的除此之外Eureka还有一种自我保护机制如果在15分钟内超过85%的节点都没有正常的心跳那么Eureka就认为客户端与注册中心出现了网络故障此时会出现以下几种情况: Eureka不再从注册列表中移除因为长时间没收到心跳而应该过期的服务Eureka仍然能够接受新服务的注册和查询请求但是不会被同步到其他节点上 (即保证当前节点依然可用)当网络稳定时当前实例新的注册信息会被同步到其他节点中 因此Eureka可以很好的应对因网络故障导致部分节点失去联系的情况而不会像zookeeper那样使整个注册服务瘫痪 四、Ribbon 1、什么是ribbon Spring Cloud Ribbon是基于Netflx Ribbon实现的一套客户端负载均衡的工具 2、Ribbon能干嘛 LB即负载均衡Load Balance在微服务或分布式集群上经常使用的一种应用 负载均衡简单的就是说能把用户的请求平摊到多个服务器上从而达到系统的HA高可用 负载均衡简单分类 集中式LB 即在服务的消费方和提供方之间使用独立的LB设施如Nginx由该设施负责把访问请求通过某种策略发至服务的提供方 进程式LB 将LB逻辑集成到消费方消费方从服务注册中心获知哪些地址可用然后自己再从这些地址中选出一个合适的服务器Ribbon就属于进程内LB它只是一个类库继承与消费方进程消费方通过它来获取到服务方的地址 3、使用Ribbon 在consumer中操作 坐标 !--Ribbon-- dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-ribbon/artifactIdversion1.4.6.RELEASE/version /dependency!--Eureka-- dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-eureka/artifactIdversion1.4.6.RELEASE/version /dependencyapplicaiton.yaml server:port: 80 # Eureka eureka:client:fetch-registry: true # 不向Eureka注册自己service-url:defaultZone: http://eureka7001:7001/eureka/,http://eureka7002:7002/eureka/, http://eureka7003:7003/eureka/主启动类 // Ribbon 和 Eureka 整合以后客户端可以直接使用不用关心IP地址和端口号 SpringBootApplication EnableEurekaClient public class DeptConsumer_80 {public static void main(String[] args) {SpringApplication.run(DeptConsumer_80.class, args);} }RestTemplate Configuration public class ConfigBean {// 配置负载均衡实现BeanLoadBalanced // Ribbon负载均衡public RestTemplate getRestTemplate(){return new RestTemplate();} }修改地址 这样当我们去访问http://localhost/consumer/dept/list就可以显示 但是这里显示的是Db01看不出来它是怎么搞的负载均衡所以要搭建一个服务提供集群再建两个服务提供者两个数据库修改配置 配置好后我们看就能发现有三个服务了 这样就可以看到轮询的负载均衡了 4、负载均衡算法 AbstractLoadBalancerRule会先过滤掉跳闸访问故障的服务~对剩下的进行轮询RoundRobinRule轮询算法RandomRule随机算法RetryRule会先按照轮询获取服务~如果服务获取失败则会在指定的时间进行 自定义负载均衡算法 Configuration public class LRule {Beanpublic IRule myRule(){return new RandomRule();} }public class MyRule extends AbstractLoadBalancerRule {// 每个服务访问5次就访问下一个服务private 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(total 5){server upList.get(currentIndex);total;}else{total 0;currentIndex ;if(currentIndex upList.size()){currentIndex 0;}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) {} }主启动类 这样启动了以后就可以去试试看看是不是每个访问5下切换到下一个服务从这里面学到了要会看源码然后仿照的去写 五、Feign 1、简介 feign是声明式的web service客户端它让微服务之间的调用变得更简单了类controller调用service。SpringCloud集成了Ribbon和Eureka可在使用Feign时提供负载均衡的http客户端。 只需要创建一个接口然后添加注解即可! feign 主要是社区大家都习惯面向接口编程。这个是很多开发人员的规范。调用微服务访问两种方法 微服务名字 [ribbon]接口和注解 [feign ] 2、Feign能干什么? Feign旨在使编写Java Http客户端变得更容易前面在使用Ribbon RestTemplate时利用RestTemplate对Http请求的封装处理形成了一套模板化的调用方法。但是在实际开发中由于对服务依赖的调用可能不止一处往往一个接口会被多处调用所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以Feign在此基础上做了进一步封装由他 来帮助我们定义和实现依赖服务接口的定义在Feign的实现下我们只需要创建一个接口并使用注解的方式来配置它(类似于以前Dao接口上标注Mapper注解现在是一个微服务接口上面标注一个Feign注解即可。)即可完成对服务提供方的接口绑定简化了使用Spring loud Ribbon时自动封装服务调用客户端的开发量。 3、使用Feign 先搞一个80端的Feign 坐标 dependencies!--实体类--dependencygroupIdcom.lzy/groupIdartifactIdspringcloud-api/artifactIdversion1.0-SNAPSHOT/version/dependency!--web--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactId/dependency!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-ribbon --!--Ribbon--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-ribbon/artifactIdversion1.4.6.RELEASE/version/dependency!--Eureka--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-eureka/artifactIdversion1.4.6.RELEASE/version/dependency!--Feign--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-feign/artifactIdversion1.4.6.RELEASE/version/dependency /dependenciescontroller RestController RequestMapping(/consumer/dept) public class DeptConsumerController {Autowiredprivate DeptClientService deptClientService;GetMapping(/get/{id})public Dept get(PathVariable(id) Long id){return this.deptClientService.queryById(id);}PostMapping(/add)public boolean add(Dept dept){return this.deptClientService.add(dept);}GetMapping(/list)public ListDept list(){return this.deptClientService.queryAll();} }主启动类 SpringBootApplication EnableEurekaClient EnableFeignClients(basePackages {com.lzy.springcloud}) public class FeignDeptConsumer_80 {public static void main(String[] args) {SpringApplication.run(FeignDeptConsumer_80.class, args);} }然后在api的那个类中搞一个server 这里坐标也要配置 dependencies!--当前Module自己需要的依赖如果父依赖中配置了版本这里直接引入即可--dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependency!--Feign--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-feign/artifactIdversion1.4.6.RELEASE/version/dependency /dependenciesserver Component FeignClient(value SPRINGCLOUD-PROVIDER-DEPT) public interface DeptClientService {GetMapping(/dept/list)public ListDept queryAll();GetMapping(/dept/get/{id})public Dept queryById(PathVariable(id) Long id);PostMapping(/dept/add)public boolean add(Dept dept); }和上面使用Ribbon感觉是一样的使用Ribbon的时候也不能这么说之前的那种方式我觉得也是把server层相当于放到了消费者里面了通过统一配置服务的名字和请求url用RestTemplate去Eureka中去获取服务现在使用了Feign他还是用的Ribbon的负载均衡但是请求方式变了现在api层搞一个service的接口把你要用的接口都写好使用Feign配置好服务的名字用GetMapper/PostMapper替代使用RestTemplate也就是相当于把服务先搞到了api层然后在消费者层你只需要像之前一样把api的server注入到里面然后通过server去调用对应的方法即可我觉得这样也不错两种方式各有优劣 六、Hystrix服务熔断 1、服务雪崩 多个微服务之间调用的时候假设微服务A调用微服务B和微服务C微服务B和微服务C又调用其他的微服务这就是所谓的“扇出”、如果扇出的链路上某个微服务的调用响应时间过长或者不可用对微服务A的调用就会占用越来越多的系统资源进而引起系统崩溃所谓的“雪崩效应”。 对于高流量的应用来说单一的后端依赖可能会导致所有服务器上的所有资源都在几秒中内饱和。比失败更糟糕的是这些应用程序还可能导致服务之间的延迟增加备份队列线程和其他系统资源紧张导致整个系统发生事多的级联故噎这些都表示需要对故喧和延识进行隔离和管理以便单个依赖关系的失败不能取消整个应用程字或系统。 2、什么是Hystrix Spring Cloud Hystrix 是一款优秀的服务容错与保护组件也是 Spring Cloud 中最重要的组件之一。 Spring Cloud Hystrix 是基于 Netflix 公司的开源组件 Hystrix 实现的它提供了熔断器功能能够有效地阻止分布式微服务系统中出现联动故障以提高微服务系统的弹性。Spring Cloud Hystrix 具有服务降级、服务熔断、线程隔离、请求缓存、请求合并以及实时故障监控等强大功能。 Hystrix [hɪst’rɪks]中文含义是豪猪豪猪的背上长满了棘刺使它拥有了强大的自我保护能力。而 Spring Cloud Hystrix 作为一个服务容错与保护组件也可以让服务拥有自我保护的能力因此也有人将其戏称为“豪猪哥”。 在微服务系统中Hystrix 能够帮助我们实现以下目标 保护线程资源防止单个服务的故障耗尽系统中的所有线程资源。快速失败机制当某个服务发生了故障不让服务调用方一直等待而是直接返回请求失败。提供降级FallBack方案在请求失败后提供一个设计好的降级方案通常是一个兜底方法当请求失败后即调用该方法。防止故障扩散使用熔断机制防止故障扩散到其他服务。监控功能提供熔断器故障监控组件 Hystrix Dashboard随时监控熔断器的状态。 3、服务熔断Demo 新建一个hystrix的provider 坐标 dependenciesdependency!--我们需要拿到实体类所以要配置api moudle--groupIdcom.lzy/groupIdartifactIdspringcloud-api/artifactIdversion1.0-SNAPSHOT/version/dependency!--junit--dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdscopelzy.springcloud.test/scope/dependency!--数据库--dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactId/dependencydependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactId/dependencydependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactId/dependencydependencygroupIdch.qos.logback/groupIdartifactIdlogback-core/artifactId/dependency!--web--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!--jetty--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-jetty/artifactId/dependency!--热部署--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactId/dependency!--Eureka--!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka --dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-eureka/artifactIdversion1.4.6.RELEASE/version/dependency!--完善监控信息--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependency!--hystrix--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-hystrix/artifactIdversion1.4.6.RELEASE/version/dependency /dependenciescontroller 注解HystrixCommand // 提供Resultful服务 RestController RequestMapping(/dept) public class DeptController {Autowiredprivate DeptService deptService;GetMapping(/get/{id})HystrixCommand(fallbackMethod get_Hystrix)public Dept get(PathVariable(id) Long id){LambdaQueryWrapperDept lqw new LambdaQueryWrapper();lqw.eq(Dept::getDeptno, id);Dept one deptService.getOne(lqw);if(one null){throw new RuntimeException(id id 不存在该用户或者信息无法找到~);}return one;}public Dept get_Hystrix(PathVariable(id) Long id){Dept dept new Dept();dept.setDeptno(id);dept.setDname(id id 没有对应的信息null--Hystrix);dept.setDbSource(no this database in MySQL);return dept;} }主启动类 SpringBootApplication EnableEurekaClient // 自动注册到Eureka EnableDiscoveryClient // 服务发现 EnableCircuitBreaker // 添加对熔断的支持 public class DeptProviderHystrix_8001 {public static void main(String[] args) {SpringApplication.run(DeptProviderHystrix_8001.class, args);} }启动注册集群和刚整好的项目访问当出错的时候就会自动跳转到我们预先搞的处理错误的方法里面兜底 4、服务降级Demo 4.1、Feign风格 api端 DeptClientServiceFallbackFactory // 降级~ Component public class DeptClientServiceFallbackFactory implements FallbackFactory {Overridepublic DeptClientService create(Throwable throwable) {return new DeptClientService() {Overridepublic ListDept queryAll() {return null;}Overridepublic Dept queryById(Long id) {Dept dept new Dept();dept.setDeptno(id);dept.setDname(id id 没有对应的信息客户端提供了降级的信息这个服务现在已经被关闭了);dept.setDbSource(没有数据);return dept;}Overridepublic boolean add(Dept dept) {return false;}};} }DeptClientService Component FeignClient(value SPRINGCLOUD-PROVIDER-DEPT, fallbackFactory DeptClientServiceFallbackFactory.class) public interface DeptClientService {GetMapping(/dept/list)public ListDept queryAll();GetMapping(/dept/get/{id})public Dept queryById(PathVariable(id) Long id);PostMapping(/dept/add)public boolean add(Dept dept); }api这里的feign中集成了Hystrix也就是说在客户端做了一个服务降级 feign的80的客户端里面的application.yaml 开启hystrix server:port: 80 # Eureka eureka:client:fetch-registry: true # 不向Eureka注册自己service-url:defaultZone: http://eureka7001:7001/eureka/,http://eureka7002:7002/eureka/, http://eureka7003:7003/eureka/feign:hystrix:enabled: true启动Eureka集群然后启动没有服务熔断的8001的provider启动feign的80客户端一开始我们能正常访问但是当你某个业务并发量太大为了不让其崩掉我们需要先手动停掉其他的服务把资源都供并发量大的服务去所以现在当我们把8001服务停掉再去访问的时候就会出现降级的提示 服务熔断和服务降级降级的区别 触发原因不一样服务熔断由链路上某个服务引起的服务降级是从整体的负载考虑所在地不同熔断是处在服务提供那里的降级是在客户端那里的实现方式不一样服务熔断一般是自我熔断恢复服务降级相当于人工控制 服务熔断应对雪崩效应的链路自我保护机制。可看作降级的特殊情况 服务降级系统有限的资源的合理协调 4.2、RestTemplate风格 修改一下没有feign的80客户端 依赖 dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-hystrix/artifactIdversion1.4.6.RELEASE/version /dependency做一个降级方法 RestController RequestMapping(/consumer/dept) public class DeptConsumerController {// 消费者不应该有service层~// RestTemplate..供我们直接调用Autowiredprivate RestTemplate restTemplate;// 固定前缀// private static final String REST_URL_PREFIX http://localhost:8001;// 通过Ribbon去实现的时候我们这里的地址应该是一个变量通过服务名来访问private static final String REST_URL_PREFIX http://SPRINGCLOUD-PROVIDER-DEPT;HystrixCommand(fallbackMethod getProductFallBack)GetMapping(/get/{id})public Dept get(PathVariable(id) Long id){Dept forObject restTemplate.getForObject(REST_URL_PREFIX /dept/get/ id, Dept.class);if( forObject null){throw new RuntimeException(id id 不存在该用户或者信息无法找到~);}return forObject;}public Dept getProductFallBack(PathVariable(id) Long id){Dept dept new Dept();dept.setDeptno(id);dept.setDname(id id 没有对应的信息客户端提供了降级的信息这个服务现在已经被关闭了);dept.setDbSource(没有数据);return dept;} }配置 hystrix:command:default:execution:isolation:strategy: ExecutionIsolationStrategy.SEMAPHORE #信号量隔离thread:timeoutInMilliseconds: 2000 # 默认的连接超时时间1秒,若1秒没有返回数据,自动的触发降级逻辑主启动类 // Ribbon 和 Eureka 整合以后客户端可以直接使用不用关心IP地址和端口号 SpringBootApplication EnableCircuitBreaker // RibbonClient(name SPRINGCLOUD-PROVIDER-DEPT,configuration MyRule.class) public class DeptConsumer_80 {public static void main(String[] args) {SpringApplication.run(DeptConsumer_80.class, args);} }测试一下当将provider停掉以后弹出我们降级后的方法和Feign差不多 这里我尝试了一下同时启用服务熔断和服务降级当我们请求本身发生错误的时候就会触发服务端的熔断机制如果是服务端关闭了也是出现了错误的时候就自动触发的服务降级我咋感觉有点像那个鲁棒性程序更加健壮了 服务熔断服务端~ 某个服务超时或者异常引起熔断~ 保险丝~ 服务降级客户端~ 从整体网站请求负载考虑~当某个服务熔断或者关闭之后服务将不再被调用此时在客户端就可以准备一个FallbackFactory返回一个默认的值缺省值整体的服务水平下降但是还能用 5、Dashboard流监控 创建一个监控的服务 坐标 dependencies!--实体类--dependencygroupIdcom.lzy/groupIdartifactIdspringcloud-api/artifactIdversion1.0-SNAPSHOT/version/dependency!--web--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactId/dependency!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-ribbon --!--Ribbon--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-ribbon/artifactIdversion1.4.6.RELEASE/version/dependency!--Eureka--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-eureka/artifactIdversion1.4.6.RELEASE/version/dependency!--Hystrix--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-hystrix/artifactIdversion1.4.6.RELEASE/version/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-hystrix-dashboard/artifactIdversion1.4.6.RELEASE/version/dependency /dependencies主启动类 SpringBootApplication EnableHystrixDashboard public class DeptConsumerDashboard_9001 {public static void main(String[] args) {SpringApplication.run(DeptConsumerDashboard_9001.class, args);} }然后在集成了Hystrix的provider中的主启动器上加一个Bean SpringBootApplication EnableEurekaClient // 自动注册到Eureka EnableDiscoveryClient // 服务发现 EnableCircuitBreaker // 添加对熔断的支持 public class DeptProviderHystrix_8001 {public static void main(String[] args) {SpringApplication.run(DeptProviderHystrix_8001.class, args);}// 增加一个ServletBeanpublic ServletRegistrationBean hystrixMetricsStreamServlet(){ServletRegistrationBean registrationBean new ServletRegistrationBean(new HystrixMetricsStreamServlet());registrationBean.addUrlMappings(/actuator/hystrix.stream);return registrationBean;} }当你启动Eureka集群并且启动监控的服务访问监控服务的localhost:你设置的端口就可以看到 然后启动集成Hystrix的provider访问localhost:你的端口号/actuator/hystrix.stream就可以看到了 把localhost:你的端口号/actuator/hystrix.stream按照下面 最后一边请求你监控的服务就可以看到监控到的信息了 七、Zuul 1、什么是zuul Zuul包含了对请求的路由和过滤两个最主要的功能其中路由功能负责将外部请求转发到具体的微服务实例上是实现外部访问统一入口的基础而过滤器功能则负责对请求的处理过程进行干预是实现请求校验服务聚合等功能的基础。Zuul和Eureka进行整合将Zuul自身注册为Eureka服务治理下的应用同时从Eureka中获得其他微服务的消息也即以后的访问微服务都是通过Zuul跳转后获得。注意: Zuul服务最终还是会注册进Eureka提供: 代理 路由 过滤 三大功能! 2、Demo 新建一个项目算是一个服务zuul 坐标 dependencies!--实体类--dependencygroupIdcom.lzy/groupIdartifactIdspringcloud-api/artifactIdversion1.0-SNAPSHOT/version/dependency!--web--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactId/dependency!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-ribbon --!--Ribbon--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-ribbon/artifactIdversion1.4.6.RELEASE/version/dependency!--Eureka--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-eureka/artifactIdversion1.4.6.RELEASE/version/dependency!--Hystrix--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-hystrix/artifactIdversion1.4.6.RELEASE/version/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-hystrix-dashboard/artifactIdversion1.4.6.RELEASE/version/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-zuul/artifactIdversion1.4.6.RELEASE/version/dependency /dependencies配置文件 server:port: 9527 spring:application:name: springcloud-zuul eureka:client:service-url:defaultZone: http://eureka7001:7001/eureka/,http://eureka7002:7002/eureka/,http://eureka7003:7003/eureka/instance:instance-id: springcloud-zuul-9527 # 修改Eureka上面的默认描述信息prefer-ip-address: true info:app.name: lzycompany.name: blog.lzy.com zuul:routes:mydept.serviceId: springcloud-provider-deptmydept.path: /mydept/**# ignored-services: springcloud-provider-dept # 不能再使用路径去访问了ignored-services: *prefix: /lzy # http://www.lzy.com:9527/lzy/mydept/dept/get/1 又加了一个公共前缀主启动类 SpringBootApplication EnableZuulProxy public class ZuulApplication_9527 {public static void main(String[] args) {SpringApplication.run(ZuulApplication_9527.class, args);} }目前是有三种可以访问服务的方式 通过直接访问服务提供者http://localhost:8001/dept/get/1通过将服务注册到Eureka中然后通过Eureka的服务名字http://localhost/consumer/dept/get/1 通过注册Zuul服务配置Zuul可以加上一层你设置的路由规则去访问服务 http://www.lzy.com:9527/lzy/mydept/dept/get/1 我感觉加了这层Zuul之后消费端的请求方式应该也要发生变化感觉之前那个RestTemplate也可以达到这个效果不知道后面是不是把这个Zuul和RestTemplate合并到一起 八、Config分布式配置 1、分布式系统面临的–配置文件的问题 微服务意味着要将单体应用中的业务拆分成一个个子服务每个服务的粒度相对较小因此系统中会出现大量的服务由于每个服务都需要必要的配置信息才能运行所以一套集中式的动态的配置管理设施是必不可少的。SpringCloud提供了ConfigServer来解决这个问题我们每一个微服务自己带着一个application.yml那上百的的配置文件要修改起来岂不是要发疯! Spring Cloud Config 为微服务架构中的微服务提供集中化的外部配置支持配置服务器为各个不同微服务应用的所有环节提供了一个中心化的外部配置。Spring Cloud Config 分为服务端和客户端两部分: 服务端也称为 分布式配置中心它是一个独立的微服务应用用来连接配置服务器并为客户端提供获取配置信息加密解密信息等访问接口。客户端则是通过指定的配置中心来管理应用资源以及与业务相关的配置内容并在启动的时候从配置中心获取和加载配置信息。配置服务器默认采用git来存储配置信息这样就有助于对环境配置进行版本管理。并且可以通过git客户端工具来方便的管理和访问配置内容。 2、SpringCloud config分布式配置中心能干嘛 集中管理配置文件不同环境不同配置动态化的配置更新分环境部署比如 /dev /test/ /prod /beta /release。运行期间动态调整配置不再需要在每个服务部署的机器上编写配置文件服务会向配置中心统一拉取配置自己的信息。当配置发生变动时服务不需要重启即可感知到配置的变化并应用新的配置将配置信息以REST接口的形式暴露 3、配置Git 下载安装Githttps://blog.csdn.net/qq_35246620/article/details/68951724在gitee上建立一个仓库然后本地生成公钥放到gitee的ssh中将本地仓库和远程仓库连接起来https://gitee.com/help/articles/4191和https://gitee.com/help/articles/4122本地创建一个application.yamlgit add . 、git commit -m “first” 、 git push spring:profiles:active: dev --- spring:profiles: devapplication:name: springcloud-config-dev --- spring:profiles: testapplication:name: springcloud-config-test就可以看到了 4、Server连接Git配置 创建一个config的新的项目 坐标 dependencies!--web--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!--Eureka--!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-config-server --dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-config-server/artifactIdversion2.1.1.RELEASE/version/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependency /dependencies配置文件 server:port: 3344 spring:application:name: springcloud-config-server# 连接远程仓库cloud:config:server:git:uri: https://gitee.com/lzy612/springcloud-config.git # 这里要用httpsskip-ssl-validation: true #可以使 Git 服务器 SSL 证书的服务器验证配置失效。配置连接仓库的地址我还关了验证SSL证书的配置 主启动类 SpringBootApplication EnableConfigServer public class Config_Server_3344 {public static void main(String[] args) {SpringApplication.run(Config_Server_3344.class, args);} }然后通过访问http://localhost:3344/application-test.yaml或者http://localhost:3344/application-dev.yaml就可看到相应的配置文件 这个访问地址还支持下面这些风格的访问方式 5、客户端连接服务端 新建一个客户端来读取配置 坐标 dependencies !--web--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!--Eureka--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependency!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-config --dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-config/artifactIdversion2.1.1.RELEASE/version/dependency /dependencies上传一个配置文件 config-client.yaml spring:profiles:active: dev --- server:port: 8201 spring:profiles: devapplication:name: springcloud-provider-dept# Eureka的配置服务注册到哪里 eureka:client:service-url:defaultZone: http://eureka7001:7001/eureka/,http://eureka7002:7002/eureka/,http://eureka7003:7003/eureka/instance:instance-id: springcloud-provider-dept-8001 # 修改Eureka上面的默认描述信息prefer-ip-address: true--- server:port: 8202 spring:profiles: testapplication:name: springcloud-provider-dept# Eureka的配置服务注册到哪里 eureka:client:service-url:defaultZone: http://eureka7001:7001/eureka/,http://eureka7002:7002/eureka/,http://eureka7003:7003/eureka/instance:instance-id: springcloud-provider-dept-8001 # 修改Eureka上面的默认描述信息prefer-ip-address: true这里默认是dev的配置 配置文件bootstrap、application bootstrap # 系统级别的配置 spring:cloud:config:name: config-client # 需要从git上读取的资源名称不需要后缀# 这里拿的就是上面的dev的8201的配置uri: http://localhost:3344profile: devlabel: masterapplication # 用户级别的配置 spring:application:name: springcloud-config-server-3355主启动类 SpringBootApplication public class Config_Client_3355 {public static void main(String[] args) {SpringApplication.run(Config_Client_3355.class, args);} }controller RestController public class ConfigClientController {Value(${spring.application.name})private String applicationName;Value(${eureka.client.service-url.defaultZone})private String eurekaServer;Value(${server.port})private String port;RequestMapping(/config)public String getInfo(){return applicationName applicationName eurekaServer eurekaServer port port;} }启动config-sever启动config-client端访问http://localhost:8201/config可以看到config-client读取的配置就是你git远端上指定的dev的配置属性的值这样就简介的实现了配置文件的统一git管理不用你在本地搞本地负责的就是取config-server中读取配置好的配置即可 6、测试 现在将我们的一个Eureka和一个prodiver继承上Config 将配置文件上传到git上 config-eureka spring:profiles:active: dev--- server:port: 7001 spring:profiles: devapplication:name: springcloud-config-eureka# EurekaService_7001 eureka:instance:hostname: eureka7001 #Eureka服务端的实例名字client:register-with-eureka: false # 表示是否向Eureka注册中心注册自己fetch-registry: false # fetch-registry如果为false则表示自己为注册中心service-url: # 监控页面~# 单机# defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/# 集群defaultZone: http://eureka7002:7002/eureka/, http://eureka7003:7003/eureka/---server:port: 7001 spring:profiles: testapplication:name: springcloud-config-eureka# EurekaService_7001 eureka:instance:hostname: eureka7001 #Eureka服务端的实例名字client:register-with-eureka: false # 表示是否向Eureka注册中心注册自己fetch-registry: false # fetch-registry如果为false则表示自己为注册中心service-url: # 监控页面~# 单机# defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/# 集群defaultZone: http://eureka7002:7002/eureka/, http://eureka7003:7003/eureka/config-dept spring:profiles:active: dev --- server:port: 8001#mybaits-plus mybatis-plus:configuration:map-underscore-to-camel-case: truelog-impl: org.apache.ibatis.logging.stdout.StdOutImplglobal-config:db-config:id-type: ASSIGN_IDtype-aliases-package: com.lzy.springcloud.pojo#spring的配置 spring:profiles: devapplication:name: springcloud-config-deptdatasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/db01?allowPublicKeyRetrievaltrueuseUnicodetruecharacterEncodingutf-8serverTimezoneAsia/ShanghaiuseSSLfalseusername: rootpassword: lige0612# Eureka的配置服务注册到哪里 eureka:client:service-url:defaultZone: http://eureka7001:7001/eureka/,http://eureka7002:7002/eureka/,http://eureka7003:7003/eureka/instance:instance-id: springcloud-provider-dept-8001 # 修改Eureka上面的默认描述信息prefer-ip-address: true # info配置 info:app.name: lzycompany.name: blog.lzy.com--- server:port: 8001#mybaits-plus mybatis-plus:configuration:map-underscore-to-camel-case: truelog-impl: org.apache.ibatis.logging.stdout.StdOutImplglobal-config:db-config:id-type: ASSIGN_IDtype-aliases-package: com.lzy.springcloud.pojo#spring的配置 spring:profiles: devapplication:name: springcloud-config-deptdatasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/db02?allowPublicKeyRetrievaltrueuseUnicodetruecharacterEncodingutf-8serverTimezoneAsia/ShanghaiuseSSLfalseusername: rootpassword: lige0612# Eureka的配置服务注册到哪里 eureka:client:service-url:defaultZone: http://eureka7001:7001/eureka/,http://eureka7002:7002/eureka/,http://eureka7003:7003/eureka/instance:instance-id: springcloud-provider-dept-8001 # 修改Eureka上面的默认描述信息prefer-ip-address: true # info配置 info:app.name: lzycompany.name: blog.lzy.com创建一个config版本的Eureka除了配置文件不复制其他的都复制即可 坐标 dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-config/artifactIdversion2.1.1.RELEASE/version /dependency配置文件 bootstrap # 系统级别的配置 spring:cloud:config:name: config-eureka # 需要从git上读取的资源名称不需要后缀uri: http://localhost:3344profile: devlabel: masterbootstrap中的profile的值才是你在git上的config中取的东西这个找环境配置不是由git上面决定的是由这里决定的我尝试了一下我把git上面的改成dev1,用的是db01数据库然后我再本地用的是test然后访问出来的数据就是db02的说明了我上述说的应该是对的当你本地用的是dev的然后git端修改dev中配置为db03的时候本地热部署一下访问的也就是db03了说明git上那个指定配置的没啥用还是要看本地用谁才是谁不过这样总的来说还是突出了一点就是配置文件与程序解耦 application # 用户级别的配置 spring:application:name: springcloud-config-eureka-7001创建一个config版本的provider除了配置文件不复制其他的都复制即可 坐标 dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-config/artifactIdversion2.1.1.RELEASE/version /dependency配置文件 bootstrap # 系统级别的配置 spring:cloud:config:name: config-dept # 需要从git上读取的资源名称不需要后缀uri: http://localhost:3344profile: devlabel: masterapplication # 用户级别的配置 spring:application:name: springcloud-config-provider-dept-8001启动config版本的eureka启动config的provider启动config的Server启动一个80客户端 当你的eureka、provider正常启动能登录到监控中心即可访问一下http://localhost/consumer/dept/get/1成功
http://www.hkea.cn/news/14290278/

相关文章:

  • 网站数据库设置权限邵阳做网站价格
  • 样本之家登录网站无锡机关单位建设网站
  • 网站文章百度不收录网站底部导航制作
  • 建网站步骤苏州凌云建设有限公司
  • 深圳品牌网站柬埔寨网站建设
  • 揭阳网站制作怎样购买网站模板
  • 网站模板目录扫描怎样做百度网站推广
  • 做公司门户网站的重点国内免费推广产品的网站
  • 有一个外国网站专门做街头搭讪交易猫假网站制作
  • 网站建设 镇江丹阳建设网站教程视频视频
  • 深圳市建设监理协会网站建设新网站
  • 南宁网络公司网站建设权重查询
  • 进口食品销售销售在那个网站做网站开发培训机构排名
  • 广昌建设局官方网站wordpress免费搭建个人博客
  • 网站请人做要多少钱公司做网站主机是什么用途
  • 什么建站程序最利于seo网站logo图怎么做的
  • 网站设计工从零开始制作 wordpress 主题
  • 网站统计模块去掉自动升级wordpress失败提示
  • 秦皇岛优化网站排名wordpress 快讯模板
  • 门户网站建设技术方案查企业法人电话大全
  • 没有做icp备案的网站为什么建设银行的网站打不开
  • 怎样制作网站教程哪家好网站设计 公司 长沙
  • 清新区住房和城乡建设部网站建设银行官网首页网站招聘
  • 公司网站建设需要注意哪些内容wordpress提取
  • 建立网站 英语怎么说品质好是什么意思
  • 实训做网站收获郑州外贸网站制作
  • 网站建设中图标济南做网站推广有哪些公司
  • 做黑网站吗网站开发作品
  • 长沙网站制作平台甘肃省集约化网站建设
  • 东莞凤岗哪里有学做网站的免费装修设计效果图