搭建一个完整的springcloud微服务
springcloud(了解微服务)
分布式微服务架构的站式解决方案,是多种微服务架构落地技术的集合体,俗称微服务全家桶
- 微服务是一种架构风格
- 一个应用拆分为一组小型服务
- 每个服务运行在自己的进程内,也就是可独立部署和升级
- 服务之间使用轻量级HTTP交互
- 服务围绕业务功能拆分
- 可以由全自动部署机制独立部署
- 去中心化,服务自治。服务可以使用不同的语言、不同的存储技[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GMk8hJk8-1648103440832)(E:\code\java\htrain\kuangjia\springcloudimg\image-20220322195935763.png)]
微服务体系架构:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QAFV4xj0-1648103440833)(E:\code\java\htrain\kuangjia\springcloudimg\QQ截图20220322200607.png)]
springcloud入门
我的理解是每个服务是一个springboot项目,把一个大项目拆分成一个个小项目,每个小项目自己去做自己的事,开发得到简化
注意:每个springcloud版本对应的springboot版本都不一样,以防止版本冲突,我选型的版本:
springboot:2.2.2.RELEASE
springcloud:Hoxton.SR1
创建项目
这里我选的是用maven创建项目,这样就可以把版本控制起来,只要父maven项目定死了版本,子maven的版本就和父maven的版本一样了!!!
创建父maven
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>miscoservice-demo</artifactId><version>1.0-SNAPSHOT</version><modules><module>miscoservice-api</module><module>miscoservice-eureka-server7001</module><module>miscoservice-eureka-server7002</module><module>miscoservice-provider-payment8001</module><module>miscoservice-consumer-order80</module><module>miscoservice-provider-payment8002</module><module>miscoservice-consumer-feign-order80</module><module>miscoservice-provider-hystrix-payment8003</module><module>miscoservice-consumer-hystrix-order80</module><module>miscoservice-hystrix-dashboard9001</module></modules><packaging>pom</packaging><!-- 统一管理jar包版本 --><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><junit.version>4.12</junit.version><log4j.version>1.2.17</log4j.version><lombok.version>1.18.16</lombok.version><mysql.version>8.0.22</mysql.version><druid.version>1.1.16</druid.version><mybatis.spring.boot.version>2.2.1</mybatis.spring.boot.version><devtools.version>2.1.17.RELEASE</devtools.version><spring.boot.version>2.2.2.RELEASE</spring.boot.version><spring.cloud.version>Hoxton.SR1</spring.cloud.version></properties><dependencyManagement><dependencies><!--spring boot 2.2.2--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring.boot.version}</version><type>pom</type><scope>import</scope></dependency><!--spring cloud Hoxton.SR1--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring.cloud.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.17</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis.spring.boot.version}</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>${log4j.version}</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><version>${devtools.version}</version></dependency></dependencies></dependencyManagement>
</project>
创建子maven
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>miscoservice-demo</artifactId><groupId>org.example</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>miscoservice-eureka-server7001</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><!--eureka-server--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency><!--boot web actuator--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.example</groupId><artifactId>miscoservice-api</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies></project>
这样一个springcloud的项目就搭建好了
eureka
什么是服务治理
Spring Cloud封装了Netflix 公司开发的Eureka模块来实现服务治理
在传统的RPC远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务于服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。
什么是服务注册与发现
Eureka采用了CS的设计架构,Eureka Sever作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用Eureka的客户端连接到 Eureka Server并维持心跳连接。这样系统的维护人员就可以通过Eureka Server来监控系统中各个微服务是否正常运行。
在服务注册与发现中,有一个注册中心。当服务器启动的时候,会把当前自己服务器的信息比如服务地址通讯地址等以别名方式注册到注册中心上。另一方(消费者服务提供者),以该别名的方式去注册中心上获取到实际的服务通讯地址,然后再实现本地RPC调用RPC远程调用框架核心设计思想:在于注册中心,因为使用注册中心管理每个服务与服务之间的一个依赖关系(服务治理概念)。在任何RPC远程框架中,都会有一个注册中心存放服务地址相关信息(接口地址)
Eureka包含两个组件:Eureka Server和Eureka Client
Eureka Server提供服务注册服务
各个微服务节点通过配置启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到。
EurekaClient通过注册中心进行访问
它是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)
上手体验
导入依赖
<!--eureka-server-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!--boot web actuator-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
写yml
server:port: 7001
eureka:instance:hostname: eureka7001.comclient:#false表示不向注册中心注册自己。register-with-eureka: false#false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务fetch-registry: falseservice-url:#设置与Eureka server交互的地址查询服务和注册服务都需要依赖这个地址。#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/defaultZone: http://eureka7001.com:7001/eureka/#defaultZone: http://eureka7002.com:7002/eureka/server:enable-self-preservation: true#eviction-interval-timer-in-ms: 2000
写主启动类
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerMain7001 {public static void main(String[] args) {SpringApplication.run(EurekaServerMain7001.class,args);}
}
结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Erkj35SY-1648103440833)(E:\code\java\htrain\kuangjia\springcloudimg\QQ截图20220322202159.png)]
搭建成功!
修改本地localhost映射文件
目的:因为只有一台电脑,用不同的服务模拟不同的服务器,本质还是一个回环地址
位置:C:\Windows\System32\drivers\etc\hosts
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0XAdyGDe-1648103440833)(E:\code\java\htrain\kuangjia\springcloudimg\QQ截图20220322202538.png)]
搭建eureka集群
server:port: 7002
eureka:instance:hostname: eureka7002.comclient:#false表示不向注册中心注册自己。register-with-eureka: false#false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务fetch-registry: falseservice-url:#设置与Eureka server交互的地址查询服务和注册服务都需要依赖这个地址。#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/defaultZone: http://eureka7001.com:7001/eureka/#defaultZone: http://eureka7002.com:7002/eureka/server:enable-self-preservation: true#eviction-interval-timer-in-ms: 2000
搭建8001生产者端
主启动类
@EnableEurekaClient
@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain8001 {public static void main(String[] args) {SpringApplication.run(PaymentMain8001.class,args);}
}
配置yml
server:port: 8001
spring:application:name: cloud-payment-servicedatasource:type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型driver-class-name: com.mysql.jdbc.Driver # mysql驱动包jdbc:mysql://localhost:3306/demo03?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=trueusername: rootpassword: 123456druid:url: jdbc:mysql://localhost:3306/demo03?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=truemybatis:mapperLocations: classpath:mapper/*.xmltype-aliases-package: com.kuang.pojo # 所有Entity别名类所在包eureka:client:#表示是否将自己注册进Eurekaserver默认为true。register-with-eureka: true#是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡fetchRegistry: trueservice-url:defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/#defaultZone: http://localhost:7001/eurekainstance:instance-id: payment8001prefer-ip-address: true #添加此处
编写生产端的接口
搭建8002生产者集群
server:port: 8002
spring:application:name: cloud-payment-servicedatasource:type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型driver-class-name: com.mysql.jdbc.Driver # mysql驱动包username: rootpassword: 123456druid:url: jdbc:mysql://localhost:3306/demo03?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=truemybatis:mapperLocations: classpath:mapper/*.xmltype-aliases-package: com.kuang.pojo # 所有Entity别名类所在包
eureka:instance:hostname: payment802prefer-ip-address: trueclient:fetch-registry: trueregister-with-eureka: trueservice-url:defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/
搭建80消费者端
导入依赖
<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.example</groupId><artifactId>miscoservice-api</artifactId><version>1.0-SNAPSHOT</version></dependency>
</dependencies>
主启动类
@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration = MyRule.class)
public class ConsumerMain80 {public static void main(String[] args) {SpringApplication.run(ConsumerMain80.class,args);}
}
写yaml
server:port: 80spring:application:name: cloud-order-serviceeureka:client:#表示是否将自己注册进Eurekaserver默认为true。register-with-eureka: true#是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡fetchRegistry: trueservice-url:defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka#defaultZone: http://localhost:7001/eureka
结合resttemplate+ribbon去调对应的服务
@RestController
public class OrderController {//private final static String PAYMENT_URL = "http://localhost:8001";private final static String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";@Resourceprivate RestTemplate restTemplate;@GetMapping("/consumer/payment/get/{id}")public CommonResult<Student> getStudentById(@PathVariable("id") String id){return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id,CommonResult.class);}
}
Ribbon
Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。
简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。
简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们很容易使用Ribbon实现自定义的负载均衡算法。
Ribbon目前也进入维护模式。
Ribbon未来可能被Spring Cloud LoadBalacer替代。
LB负载均衡(Load Balance)是什么
简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA (高可用)。
常见的负载均衡有软件Nginx,LVS,硬件F5等。
Ribbon本地负载均衡客户端VS Nginx服务端负载均衡区别
Nginx是服务器负载均衡,客户端所有请求都会交给nginx,然后由nginx实现转发请求。即负载均衡是由服务端实现的。
Ribbon本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术。
集中式LB
即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5, 也可以是软件,如nginx),由该设施负责把访问请求通过某种策略转发至服务的提供方;
进程内LB
将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务器。
Ribbon就属于进程内LB,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址。
一句话
负载均衡 + RestTemplate调用
Openfeign
feign能干啥
前面在使用Ribbon+RestTemplate时,利用RestTemplate对http请求的封装处理,形成了一套模版化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以,Feign在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。在Feign的实现下,我们只需创建一个接口并使用注解的方式来配置它(以前是Dao接口上面标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解即可),即可完成对服务提供方的接口绑定,简化了使用Spring cloud Ribbon时,自动封装服务调用客户端的开发量。
快速上手
导入依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
写yml
server:port: 80
eureka:client:register-with-eureka: truefetch-registry: trueservice-url:defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/
spring:application:name: ORDER80feign:client:config:default: #这里就是指的所有被加载的默认FeignClient实现的服务配置都生效#指的是建立连接后从服务器读取到可用资源所用的时间connectTimeout: 5000#指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间readTimeout: 5000
主启动类
@SpringBootApplication
@EnableFeignClients
public class OrderMain80 {public static void main(String[] args) {SpringApplication.run(OrderMain80.class,args);}
}
调服务(你要调哪个服务在注解FeignClient写明)
@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
public interface PaymentService {@GetMapping(value = "/payment/get/{id}")public CommonResult<Student> getPaymentById(@PathVariable("id") String id);@GetMapping("/payment/get/timeout")public String getTimeOutServerPort();
}
Hystrix
分布式系统面临的问题
复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败。
服务雪崩
多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,这就是所谓的“扇出”。如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,所谓的“雪崩效应”.
对于高流量的应用来说,单一的后避依赖可能会导致所有服务器上的所有资源都在几秒钟内饱和。比失败更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,备份队列,线程和其他系统资源紧张,导致整个系统发生更多的级联故障。这些都表示需要对故障和延迟进行隔离和管理,以便单个依赖关系的失败,不能取消整个应用程序或系统。
所以,通常当你发现一个模块下的某个实例失败后,这时候这个模块依然还会接收流量,然后这个有问题的模块还调用了其他的模块,这样就会发生级联故障,或者叫雪崩。
Hystrix是什么
Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。
"断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。
能干什么
服务降级
服务限流
服务熔断
快速上手
1.编写一个生产者8003端
<!--hystrix-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<!--eureka client-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
public class PaymentMain8003 {public static void main(String[] args) {SpringApplication.run(PaymentMain8003.class,args);}
}
server:port: 8003
spring:application:name: cloud-payment-serviceeureka:client:#表示是否将自己注册进Eurekaserver默认为true。register-with-eureka: true#是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡fetchRegistry: trueservice-url:defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/#defaultZone: http://localhost:7001/eurekainstance:instance-id: payment8003prefer-ip-address: true #添加此处management:endpoints:web:exposure:include: "*"
服务降级
@Override
@HystrixCommand(fallbackMethod = "paymentInfoTimeOutHandler",commandProperties = {@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="2000")
})
public String paymentInfo_TimeOut() {try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}return Thread.currentThread().getName()+"耗时3秒!";
}
String paymentInfoTimeOutHandler(){return Thread.currentThread().getName()+"8001端口服务器繁忙,请稍后再试!";
}
服务熔断
//=====服务熔断
@HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",commandProperties = {@HystrixProperty(name = "circuitBreaker.enabled",value = "true"),// 是否开启断路器@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"),// 请求次数@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"), // 时间窗口期@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"),// 失败率达到多少后跳闸
})
@Override
public String paymentCircuitBreaker(Integer id) {if(id < 0) {throw new RuntimeException("******id 不能负数");}return Thread.currentThread().getName()+"\t"+"调用成功,id号: " + id;
}
public String paymentCircuitBreaker_fallback(@PathVariable("id") Integer id) {return "id 不能负数,请稍后再试,/(ㄒoㄒ)/~~ id: " +id;
}
@DefaultProperties(defaultFallback = "paymentTimeOutFallbackMethod")//如果需要服务降级默认走的方法
Gateway
Gateway是在Spring生态系统之上构建的API网关服务,基于Spring 5,Spring Boot 2和Project Reactor等技术。
Gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能,例如:熔断、限流、重试等。
SpringCloud Gateway是Spring Cloud的一个全新项目,基于Spring 5.0+Spring Boot 2.0和Project Reactor等技术开发的网关,它旨在为微服务架构提供—种简单有效的统一的API路由管理方式。
SpringCloud Gateway作为Spring Cloud 生态系统中的网关,目标是替代Zuul,在Spring Cloud 2.0以上版本中,没有对新版本的Zul 2.0以上最新高性能版本进行集成,仍然还是使用的Zuul 1.x非Reactor模式的老版本。而为了提升网关的性能,SpringCloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。
Spring Cloud Gateway的目标提供统一的路由方式且基于 Filter链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。
快速上手
<!--gateway-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
@SpringBootApplication
@EnableEurekaClient
public class GatewayMain9999 {public static void main(String[] args) {SpringApplication.run(GatewayMain9999.class,args);}
}
server:port: 9999
spring:application:name: cloud-gateway
#############################新增网关配置###########################cloud:gateway:routes:- id: payment_routh #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名uri: http://localhost:8001 #匹配后提供服务的路由地址#uri: lb://cloud-payment-service #匹配后提供服务的路由地址predicates:- Path=/payment/get/** # 断言,路径相匹配的进行路由- id: payment_routh2 #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名uri: http://localhost:8001 #匹配后提供服务的路由地址#uri: lb://cloud-payment-service #匹配后提供服务的路由地址predicates:- Path=/payment/lb/** # 断言,路径相匹配的进行路由
####################################################################
eureka:instance:hostname: cloud-gateway-serviceclient: #服务提供者provider注册进eureka服务列表内service-url:register-with-eureka: truefetch-registry: truedefaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
就可以通过9999这个端口号访问对应的服务了
config分布式配置中心
分布式系统面临的配置问题
微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能运行,所以一套集中式的、动态的配置管理设施是必不可少的。
SpringCloud提供了ConfigServer来解决这个问题,我们每一个微服务自己带着一个application.yml,上百个配置文件的管理.……
能干嘛
集中管理配置文件
不同环境不同配置,动态化的配置更新,分环境部署比如dev/test/prod/beta/release
运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息
当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的配置
将配置信息以REST接口的形式暴露 - post/crul访问刷新即可…
搭建Config Center
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
@SpringBootApplication
@EnableConfigServer
public class ConfigCenter7777 {public static void main(String[] args) {SpringApplication.run(ConfigCenter7777.class,args);}
}
server:port: 7777
spring:application:name: cloud-config-center #注册进Eureka服务器的微服务名cloud:config:server:git:uri: https://gitee.com/kuang-kuang/springcloud-config.git #GitHub上面的git仓库名字####搜索目录search-paths:# - springcloud-configusername: kuang-kuangpassword: 1999101806a####读取分支label: master
#服务注册到eureka地址
eureka:client:service-url:defaultZone: http://localhost:7001/eureka,http://localhost:7002/eureka
http://config-7777.com:7777/master/config-dev.yml
搭建Config Client
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
@SpringBootApplication
@EnableEurekaClient
public class ConfigClient7778 {public static void main(String[] args) {SpringApplication.run(ConfigClient7778.class,args);}
}
spring:cloud:config:name: config #需要从github上读取的资源名称,注意没有yml后缀名profile: prod #本次访问的配置项label: masteruri: http://localhost:7777
@RestController
//@RefreshScope
public class ConfigClientController {@Value("${spring.application.name}")private String applicationName;@Value("${eureka.client.service-url.defaultZone}")private String eurekaServers;@Value("${server.port}")private String port;@RequestMapping("/config")public String getConfig(){String str = "applicationName: " + applicationName + "\t eurekaServers:" + eurekaServers + "\t port: " + port;System.out.println("******str: " + str);return "applicationName: " + applicationName + "\t eurekaServers:" + eurekaServers + "\t port: " + port;}}
搭建一个完整的springcloud微服务相关推荐
- 利用SpringCloud搭建一个最简单的微服务框架
利用SpringCloud搭建一个最简单的微服务框架 https://blog.csdn.net/caicongyang/article/details/52974406 1.微服务 微服务主要包含服 ...
- SpringCloud微服务注册调用入门教程
关于SpringCloud的相关知识在此不做讨论 , 直接一步步完成一套简单完整的SpringCloud微服务注册与调用的Demo . 1 . 创建一个maven主工程 , 填写工程信息 , Fini ...
- 搭建一个完整的微服务项目
一.项目技术架构 1.技术栈 前台技术 Node.js.Npm.Vue.js.WebPack.Vue Cli.Element UI 后台架构 微服务架构:按照功能拆分N多个服务,每个服务可以独立技术选 ...
- 快速搭建 SpringCloud 微服务开发环境的脚手架
快速搭建 SpringCloud 微服务开发环境的脚手架 本文作者:HelloGitHub-秦人 本文适合有 SpringBoot 和 SpringCloud 基础知识的人群,跟着本文可使用和快速搭建 ...
- 黑马4天从浅入深精通SpringCloud 微服务架构(完整资料)
目录:/001 黑马4天从浅入深精通SpringCloud 微服务架构(完整资料) ┣━━day1 ┃ ┣━━01-课程介绍.mp4 ┃ ┣━━02-系 ...
- SpringCloud微服务项目搭建
常用链接 我的随笔 我的评论 我的参与 最新评论 我的标签 我的标签 springcloud(1) 随笔分类 编程(34) 随笔档案 2018年9月 (1) 2018年8月 (6) 2018年7月 ( ...
- SpringCloud微服务完整实例
转自:https://blog.csdn.net/ittechnologyhome/article/details/73824784,侵删 一微服务架构概述 1.1 微服务特性以及优点 每个服务可以独 ...
- 线上redis一般安在linux_Redis企业级应用-Linux安装搭建一个完整的linxu线上服务(上)...
我们在做项目的时候经常会遇到很多性能的问题,也成为整个系统优化最疼痛的问题,主要还是因为在用户量大的时候或者就是说高并发访问的时候,我们系统的数据库会有一个限制.当然也可以通过对数据库的优化对系统进行 ...
- SpringCloud微服务搭建(四 搭建EurekaServer集群)
在上一章的基础上 在EurekasServer里面添加三个yml: bootstrap-server1.yml: server:port: 8794eureka:instance:hostname: ...
- springcloud微服务项目架构搭建第一天
springcloud微服务项目架构搭建第一天 (一).项目简介 1.准备工作:idea创建springboot模板 2.后台应该涉及的技术(后期可能会有删改) Spring Framework 容器 ...
最新文章
- tomcat配置文件server.xml具体解释
- 使用Python批量修改数据库执行Sql文件
- 8、使用SELECTI...INTO OUTFILE导出表数据
- 6-11数据库mysql初始
- HDU-3280 Equal Sum Partitions
- php怎么生成卡券签名,小程序卡券签名错误的解决方案
- php调用函数的变量,从内PHP函数调用的变量在外部函数使用
- qt5.3.2移植到arm上出undefined reference to '__sync_sub_and_fetch_4的错
- oracle 序列验证脚本,oracle 生成序列脚本
- before css 旋转_CSS及购物车的制作练习
- mysql重复上一行的快捷_MySql三种避免重复插入数据的方法
- 《软件测试方法与技术实践指南》Java EE篇 文摘
- springboot-aop
- 层次分析法、网络层次分析法、模煳层次分析法、双基点法
- 安装 Office 2010 错误 error 1935和数据库以及安卓路线
- linux mount iso文件系统,在Linux中挂载ISO文件的两种方法(mount命令与mount软件)
- 汽车软件行业工程师详细介绍?(中)
- 双路服务器5100芯片组,华硕推AMD双路12核平台服务器主板
- python列表生成式
- 让word中插入的图片不失真,图像保持原清晰度
热门文章
- WCF for ajaxToolkit:AutoCompleteExtender
- snap7与西门子PLC连接配置
- DSP应用程序代码结构+DSP应用程序加电装载过程+DSP应用程序在线编程
- 【案例篇】DataOps崛起:数据治理需要重建!
- UBOOT——①顶层Makefile分析
- 在应用处理器上开发实时任务系统
- 如何减少线上的故障率
- Gitlab Merge Request “commits” “changes”分析
- 北大清华几十位硕士博士挤入街道办事处任职,我的几点看法
- 双软认证的政策解读、好处及申报指南