本笔记仅做学习与复习使用,不存在刻意抄袭。参考于学友菜鸟小杰子。
给各位学友强烈推荐《遇见狂神说》他的整套Java学习路线使我获益匪浅!!!
点击跳转至遇见狂神说哔哩哔哩首页
如果你也是狂神的小迷弟,可以加我好友一起探讨学习。
目录
前言:
浅谈微服务
什么是微服务
微服务的优点
微服务的缺点
微服务架构4个核心问题
SpringCloud入门概述
什么是SpringCloud
SpringCloud和SpringBoot的关系
Dubbo 和 SpringCloud技术选型
SpringCloud Rest学习环境搭建:服务提供者
介绍
SpringCloud版本选择
搭建项目
创建父工程
创建实体类(pojo)类和创建数据库
结合mybatis
springcloud-consumer-dept-80访问springcloud-provider-dept-8001下的controller使用REST方式
SpringCloud分布式开发五大神兽
Eureka服务注册中心
什么是Eureka
原理理解
Eureka基本的架构
三大角色
构建步骤
Eureka:集群环境配置
Eureka:CAP原则及对比Zookeeper
Ribbon:负载均衡(基于客户端)
ribbno是什么
ribbon能干什么?
集成ribbon 在的消费者客户端
使用Ribbon实现负载均衡
Ribbon 自定义负载均衡算法
Feign负载均衡(基于服务端)
Feign 简介
Feign 能干什么
Ribbon和Feign的区别
Feign的使用步骤
Hystrix 服务熔断
分布式系统面临的问题
服务雪崩
什么是Hystrix
Hystrix能干什么
服务熔断
Hystrix服务熔断环境搭建
实例
Hystrix 服务降级
什么是服务降级
入门案例
Hystrix服务熔断和降级对比
Hystrix:Dashboard流监控
Zuul 路由网关
什么是Zull
Zuul能干什么
为什么要建立Zuul
Zuul组件
Zuul路由网关 项目搭建
SpringCloud config分布式配置
概述
分布式系统面临的 —— 配置文件的问题
什么是Springcloud config分布式配置中心
SpringCloud config分布式配置中心能干嘛
springcloud config环境搭建配置
服务端连接Git配置
客户端连接服务端访问远程
提交远程仓库
客户端连接服务端访问远程配置
远程配置实战测试
1.服务很多,客户端该怎么访问?
2.这么多服务?服务之间如何通信?
3.这么多服务? 如何治理?
4.服务挂了怎么办?
SpringCloud是生态 是一个解决方案 例如小米公司的生态
1.Spring cloud NetFlix(重点)
2.Apache Dubbo Zookeeper
3.Spring cloud Alibaba
解决以上四个核心问题
对比结果
Dubbo | SpringCloud | |
服务注册中心 | Zookeeper | Spring Cloud Netfilx Eureka |
服务调用方式 | RPC | REST API |
服务监控 | Dubbo-monitor | Spring Boot Admin |
断路器 | 不完善 | Spring Cloud Netfilx Hystrix |
服务网关 | 无 | Spring Cloud Netfilx Zuul |
分布式配置 | 无 | Spring Cloud Config |
服务跟踪 | 无 | Spring Cloud Sleuth |
消息总栈 | 无 | Spring Cloud Bus |
数据流 | 无 | Spring Cloud Stream |
批量任务 | 无 | Spring Cloud Task |
最大区别:Spring Cloud 抛弃了Dubbo的RPC通信,采用的是基于HTTP的REST方式
严格来说,这两种方式各有优劣。虽然从一定程度上来说,后者牺牲了服务调用的性能,但也避免了上面提到的原生RPC带来的问题。而且REST相比RPC更为灵活,服务提供方和调用方的依赖只依靠一纸契约,不存在代码级别的强依赖,这个优点在当下强调快速演化的微服务环境下,显得更加合适。
- 填写配置文件时注意观察右上角的配置信息
- springcloud再没继承父类的时要留意jar包是否成功导入
每项微服务的大体流程:
- 导入依赖
- 编写配置文件
- 开启功能 @enablexxx
- 配置类
一个简单的Maven模块结构是这样的:
-- app-parent: 一个父项目(app-parent)聚合了很多子项目(app-util\app-dao\app-web...)
|-- pom.xml
|
|-- app-core
||---- pom.xml
|
|-- app-web
||---- pom.xml
......
注意版本依赖说明:https://docs.spring.io/spring-cloud/docs/
SpringBoot | SpringCloud | 关系 |
---|---|---|
1.2.x | Angel版本(天使) | 兼容SpringBoot1.2x |
1.3.x | Brixton版本(布里克斯顿) | 兼容SpringBoot1.3x,也兼容SpringBoot1.4x |
1.4.x | Camden版本(卡姆登) | 兼容SpringBoot1.4x,也兼容SpringBoot1.5x |
1.5.x | Dalston版本(多尔斯顿) | 兼容SpringBoot1.5x,不兼容SpringBoot2.0x |
1.5.x | Edgware版本(埃奇韦尔) | 兼容SpringBoot1.5x,不兼容SpringBoot2.0x |
2.0.x | Finchley版本(芬奇利) | 兼容SpringBoot2.0x,不兼容SpringBoot1.5x |
2.1.x | Greenwich版本(格林威治) |
pom
pom.xml
4.0.0
org.example
springcloud
1.0-SNAPSHOT
springcloud-api
springcloud-provider-dept-8001
springcloud-consumer-dept-80
springcloud-eureka-7001
springcloud-eureka-7002
springcloud-eureka-7003
springcloud-provider-dept-8002
springcloud-provider-dept-8003
springcloud-consumer-dept-feign
springcloud-provider-dept-hystrix-8001
springcloud-consumer-hystrix-dashboard
springcloud-zuul-9527
springcloud-config-server-3344
springcloud-config-client-3355
springcloud-config-eureka-7001
springcloud-config-dept-8001
pom
UTF-8
1.8
1.8
4.12
1.2.17
1.16.18
org.springframework.cloud
spring-cloud-dependencies
Greenwich.SR1
pom
import
org.springframework.boot
spring-boot-dependencies
2.1.4.RELEASE
pom
import
mysql
mysql-connector-java
5.1.47
com.alibaba
druid
1.1.10
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.2
ch.qos.logback
logback-core
1.2.3
junit
junit
${junit.version}
log4j
log4j
${log4j.version}}
org.projectlombok
lombok
${lombok.version}
父工程为springcloud,其下有多个子mudule
最终项目结构图
pom.xml
org.projectlombok
lombok
org.springframework.cloud
spring-cloud-starter-feign
1.4.6.RELEASE
这个模块只需要创建实体类,只需要导入lombok方便构建实体类即可。
pojo类
@Data
@NoArgsConstructor
@Accessors(chain = true) // 链式写法
public class Dept implements Serializable {
private Long deptno;
private String dname;
//每个数据存在哪个数据库的字段~微服务,一个服务对应一个数据量,同一个信息可能存在不同的数据库
private String db_source;
}
注意一下@Accessors(chain = true),链式编程的原理就是返回一个this对象,就是返回本身,达到链式效果。链式写法是:
new Dept()
.setDeptno(id)
.setDname("kuangshen");
数据库
provider(提供者)
pom.xml
org.example
springcloud-api
1.0-SNAPSHOT
junit
junit
mysql
mysql-connector-java
com.alibaba
druid
ch.qos.logback
logback-core
org.mybatis.spring.boot
mybatis-spring-boot-starter
org.springframework.boot
spring-boot-test
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-jetty
org.springframework.boot
spring-boot-devtools
server:
port: 8001
# mybatis配置
mybatis:
type-aliases-package: com.kuang.springcloud.pojo
config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath:mybatis/mapper/*.xml
# spring配置
spring:
application:
name: springcloud-provider-dept
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/db01?useUnicode=true&characterEncoding=utf8 #8版本以上需要加上时区配置serverTimezone=GMT%2B8
username: root
password: root #(你的MySQL密码)
编写配置文件
DeptMapper.xml
insert into dept (dname, db_source)
values (#{dname}, DATABASE())
mybatis-config.xml
就开个缓存,表示下他的存在就好。
dao层
@Mapper
作用:用在接口类上,在编译之后会生成相应的接口实现类
位置:对应的某个接口类上面
@Mapper
@Repository
public interface DeptDao {
/**
*插入操作
*/
public boolean addDept(Dept dept);
/**
*通过id查询操作
*/
public Dept queryById(Long id);
/**
*查询全部操作
*/
public List queryAll();
}
service
public interface DeptService {
public boolean addDept(Dept dept);
public Dept queryById(Long id);
public List queryAll();
}
serviceImpl
@Service
public class DeptServiceImpl implements DeptService{
@Autowired
private DeptDao deptDao;
@Override
public boolean addDept(Dept dept) {
return deptDao.addDept(dept);
}
@Override
public Dept queryById(Long id) {
return deptDao.queryById(id);
}
@Override
public List queryAll() {
return deptDao.queryAll();
}
}
controller
@RestController
public class DeptController {
@Autowired
private DeptService deptService;
@PostMapping("/dept/add")
public boolean addDept(@RequestBody Dept dept) {
return deptService.addDept(dept);
}
@GetMapping("/dept/get/{id}")
public Dept get(@PathVariable("id") Long id) {
Dept dept = deptService.queryById(id);
if (dept == null) {
throw new RuntimeException("Fail");
}
return dept;
}
@GetMapping("/dept/list")
public List queryAll() {
return deptService.queryAll();
}
}
启动类
@SpringBootApplication
public class DeptProvider_8001 {
public static void main(String[] args) {
SpringApplication.run(DeptProvider_8001.class, args);
}
}
pom.xml
org.example
springcloud-api
1.0-SNAPSHOT
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-devtools
application.yml
server: port: 80
使用RestTemplete先需要放入Spring容器中
@Configuration
public class ConfigBean {
// 配置负载均衡
// IRule
// RoundRobinRule 轮询
// RandomRule 随机
// AvailabilityFilteringRule 会先过滤,跳闸,访问故障的服务,对剩下的进行轮询
// RetryRule:会先按照论照轮询获取服务~如果服务获取失败,则会在指定的时间内进行,重试 @LoadBalanced
@Bean
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
如小标题所示
@RestController
public class DeptConsumerController {
// 理解:消费者,不应该有service层
// RestTemplate ... 供我们直接调用就可以了!注册到spring中
@Autowired
private RestTemplate restTemplate;
// 提供多种远程便捷访问远程http服务的方法
// 使用ribbon作为负载均衡,这里的地址应该是一个变量,通过服务名来访问
private static final String REST_URL_PREFIX = "http://localhost:8001";
// private static final String REST_URL_PREFIX = "http://SPRINGCLOUD-PROVIDER-DEPT";
@RequestMapping("/consumer/dept/add")
public boolean add(Dept dept) {
return restTemplate.postForObject(REST_URL_PREFIX + "/dept/add", dept,
Boolean.class);
}
// 没有service层,通过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 List list() {
return restTemplate.getForObject(REST_URL_PREFIX + "/dept/list", List.class);
}
}
至此项目的基本骨架已经搭建完成,接下来就是添加spring cloud的五大神兽
org.springframework.cloud
spring-cloud-starter-eureka-server
1.4.6.RELEASE
org.springframework.boot
spring-boot-devtools
3.application.yml
server:
port: 7001
# Eureka配置
eureka:
instance:
# Eureka服务端的实例名字
hostname: 127.0.0.1
client:
# 表示是否向 Eureka 注册中心注册自己(这个模块本身是服务器,所以不需要)
register-with-eureka: false
# fetch-registry如果为false,则表示自己为注册中心,客户端的化为 ture
fetch-registry: false
# Eureka监控页面~
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
4.主启动类
/**
* @Auther: csp1999
* @Date: 2020/05/18/10:26
* @Description: 启动之后,访问 http://127.0.0.1:7001/
*/
@SpringBootApplication
// @EnableEurekaServer 服务端的启动类,可以接受别人注册进来~
@EnableEurekaServer
public class EurekaServer_7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaServer_7001.class,args);
}
}
访问http://localhost:7001/显示:
1.导入Eureca依赖
org.springframework.cloud
spring-cloud-starter-eureka
1.4.6.RELEASE
2.application中新增Eureca配置
# Eureka配置:配置服务注册中心地址
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka/
3.为主启动类添加@EnableEurekaClient注解
/**
* @Auther: csp1999
* @Date: 2020/05/17/22:09
* @Description: 启动类
*/
@SpringBootApplication
// @EnableEurekaClient 开启Eureka客户端注解,在服务启动后自动向注册中心注册服务
@EnableEurekaClient
public class DeptProvider_8001 {
public static void main(String[] args) {
SpringApplication.run(DeptProvider_8001.class,args);
}
}
EureKa自我保护机制:好死不如赖活着
一句话总结就是:某时刻某一个微服务不可用,eureka不会立即清理,依旧会对该微服务的信息进行保存!
默认情况下,当eureka server在一定时间内没有收到实例的心跳,便会把该实例从注册表中删除(默认是90秒),但是,如果短时间内丢失大量的实例心跳,便会触发eureka server的自我保护机制,比如在开发测试时,需要频繁地重启微服务实例,但是我们很少会把eureka server一起重启(因为在开发过程中不会修改eureka注册中心),当一分钟内收到的心跳数大量减少时,会触发该保护机制。
初始化
新建springcloud-eureka-7002、springcloud-eureka-7003 模块
1.为pom.xml添加依赖 (与springcloud-eureka-7001相同)
org.springframework.cloud
spring-cloud-starter-eureka-server
1.4.6.RELEASE
org.springframework.boot
spring-boot-devtools
javax.xml.bind
jaxb-api
2.3.0
com.sun.xml.bind
jaxb-impl
2.3.0
org.glassfish.jaxb
jaxb-runtime
2.3.0
javax.activation
activation
1.1.1
2.application.yml配置(与springcloud-eureka-7001相同)
server:
port: 7003
# Eureka配置
eureka:
instance:
hostname: localhost # Eureka服务端的实例名字
client:
register-with-eureka: false # 表示是否向 Eureka 注册中心注册自己(这个模块本身是服务器,所以不需要)
fetch-registry: false # fetch-registry如果为false,则表示自己为注册中心
service-url: # 监控页面~
# 重写Eureka的默认端口以及访问路径 --->http://localhost:7001/eureka/
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
3.主启动类(与springcloud-eureka-7001相同)
/**
* @Auther: csp1999
* @Date: 2020/05/18/10:26
* @Description: 启动之后,访问 http://127.0.0.1:7003/
*/
@SpringBootApplication
// @EnableEurekaServer 服务端的启动类,可以接受别人注册进来~
public class EurekaServer_7003 {
public static void main(String[] args) {
SpringApplication.run(EurekaServer_7003.class,args);
}
}
集群成员相互关联
配置一些自定义本机名字,找到本机hosts文件并打开
完整的springcloud-eureka-7001下的application.yml如下
server:
port: 7003
#Eureka
eureka:
instance:
hostname: localhost # Eureka服务端的实例名称
client:
register-with-eureka: false # 表示是否向eureka注册中心注册自己
fetch-registry: false # fetch-registry如果为false,则表示自己为注册中心
service-url: # 监控页面
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
配置完毕后启动eureka7001,eureka7002,eureka7003的注册中心 和 8001服务提供者端口
同时访问localhost:7001 7002 7003 可以看到当前服务中挂载的另外两个服务
当我们随机关机一个集群,我们可看到另外两个集群还可使用。不影响使用
至此 .Eureka集群搭建完毕
在本例中服务注册请求在 eureka7001 中注册成功,
即 eureka7001 对应的 Eureka Server服务的状态是UP,
则不会向另外两个节点(eureka7002,eureka7003)发送请求,
相应地页面上也就没有显示。一旦停止 eureka7001 服务注册中心,则 dept-8001 服务会向 eureka7002 发送注册请求
回顾CAP原则
RDBMS (Mysql. Oracle. sqlServer) ==> ACID
NoSQL (redis. mongdb) ==>CAP
ACID是什么?
CAP是什么?
C (Consistency) 强一致性
A (Availabilty)可用性
P (Partition tolerance)分区容错性
CAP的三进二: CA、AP、 CP
CAP理论的核心
作为服务注册中心,Eureka比Zookeeper好在哪里?
著名的CAP理论指出,一个分布式系统不可能同时满足C (一致性)、A (可用性)、P (容错性) .
由于分区容错性P在分布式系统中是必须要保证的,因此我们只能在A和C之间进行权衡。
CP
AP
Zookeeper保证的是CP
当向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的注册信息,但不能接受服务直接down掉不可用。也就是说,服务注册功能对可用性的要求要高于一致性。但是zk会出现这样一种情况,当master节点因为网络故障与其他节点失去联系时,剩余节点会重新进行leader选举。问题在于,选举leader的时间太长,30 ~ 120s, 且选举期间整个zk集群都是不可用的,这就导致在选举期间注册服务瘫痪。在云部署的环境下,因网络问题使得zk集群失去master节点是较大概率会发生的事,虽然服务能够最终恢复,但是漫长的选举时间导致的注册长期不可用是不能容忍的。
Eureka保证的是AP
Eureka看明白了这一点,因此在设计时就优先保证可用性。Eureka各个节点都是平等的,几个节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。而Eureka的客户端在向某个Eureka注册或如果发现连接失败,则会自动切换至其它节点,只要有一台Eureka还在,就能保证注册服务可用(保证可用性),只不过查到的信息可能不是最新的(不保证强一致性)。除此之外,Eureka还有一种自我保护机制,如果在15分钟内超过85%的节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,此时会出现以下几种情况:
因此,Eureka可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像zookeeper那样使整个注册服务瘫痪。
Nginx
,Lvs
等等在消费者 80 端口配置 Eureka和Ribbon负载均衡依赖
springcloud-consumer-dept-80向pom.xml中添加Ribbon和Eureka依赖
org.springframework.cloud
spring-cloud-starter-ribbon
1.4.6.RELEASE
org.springframework.cloud
spring-cloud-starter-eureka
1.4.6.RELEASE
在application.yml文件中配置Eureka
server:
port: 80
# Eureka配置
eureka:
client:
register-with-eureka: false # 不向Eureka注册自己
service-url:
defaultZone: http://eureka7003.com:7003/eureka/,http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
主启动类加上@EnableEurekaClient注解,开启Eureka
@SpringBootApplication
@EnableEurekaClient
//在微服务启动的时候就能去加载我们自定义的Ribbon类
@RibbonClient(name = "SPRINGCLOUD-PROVIDER-DEPT", configuration = KuangRule.class)
public class DeptConsumer_80 {
public static void main(String[] args) {
SpringApplication.run(DeptConsumer_80.class, args);
}
}
自定义Spring配置类:ConfigBean.java 配置负载均衡实现RestTemplate
@Configuration
// @Configuration --- spring applicationContext.xml
public class ConfigBean {
/**
* IRule:
* RoundRobinRule 轮询策略
* RandomRule 随机策略
* AvailabilityFilteringRule : 会先过滤掉,跳闸,访问故障的服务~,对剩下的进行轮询~
* RetryRule : 会先按照轮询获取服务~,如果服务获取失败,则会在指定的时间内进行,重试
*/
//配置负载均衡实现RestTemplate
@Bean
@LoadBalanced //Ribbon
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
修改conroller:DeptConsumerController.java
//Ribbon:我们这里的地址,应该是一个变量,通过服务名来访问
//private static final String REST_URL_PREFIX = "http://localhost:8001";
private static final String REST_URL_PREFIX = "http://SPRINGCLOUD-PROVIDER-DEPT";
启动7001 7002 7003注册中心 8001提供者端口 80消费者端口
localhost/consumer/dept/list 查出所有数据。
当前提供方只有一个项目,当前体会不到负载均衡,所以需要创建多个提供方来实现负载均衡
1.新建两个服务提供者Moudle:springcloud-provider-dept-8003、springcloud-provider-dept-8002
2.参照springcloud-provider-dept-8001 依次为另外两个Moudle添加pom.xml依赖 、resourece下的mybatis和application.yml配置,Java代码
3.启动所有服务测试(根据自身电脑配置决定启动服务的个数),访问http://eureka7001.com:7002/查看结果
测试访问http://localhost/consumer/dept/list 这时候随机访问的是服务提供者8003
在主目录外 创建myrule文件包
在myrule下创建RuleConfig
//自定义Ribbon配置的负载均衡类,客户端RibbonConfiguration中已存在的组件与FooConfiguration中的任何组件组成(后者通常会覆盖前者)
//自定义的组件请注意 它不在|程序的上下文的ComponentScan中,所以要放在单独的不重叠的包中
@Configuration
public class RuleConfig {
@Bean
public IRule myRule(){
//默认是轮询,现在我们自定义为DiyRandomRule 自定义负载均衡
return new DiyRandomRule();
}
}
12345678910
在myrule包下创建DiyRandomRule,双击shift搜索 RandomRule 全部复制,改为自己自定义算法负载均衡
public class DiyRandomRule extends AbstractLoadBalancerRule {
//代码全是复制的 DiyRandomRule.class的,自定义负载均衡需要自己修改
//当前自定义负载均衡:
//每个服务访问5次。换下一个服务
//total=0,默认=0,如果=5,指向下一个服务节点
//index=0,默认0,如果total=5,则inedx+1
private int totla=0;//被调用的次数
private int currentIndex=0;//当前是谁在提供服务
public Server choose(ILoadBalancer lb, Object key) {
if (lb == null) {
return null;
} else {
Server server = null;
while (server == null) {
if (Thread.interrupted()) {
return null;
}
List upList = lb.getReachableServers();//获得活着的服务
List allList = lb.getAllServers();//获得全部的服务
int serverCount = allList.size();
if (serverCount == 0) {
return null;
}
//int index = this.chooseRandomInt(serverCount);//生成区间随机数
//server = (Server) upList.get(index);//从活着的服务中,随机获取一个
//================自定义负载均衡算法==================
if(totla<5){
server = upList.get(currentIndex);
totla++;
}else{
totla=0;
currentIndex++;
if (currentIndex>=upList.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) {
}
}
在80启动器上添加自定义负载均衡配置引用的@RibbonClien注解
//消费者 运行方式80可省略 例:localhost/consumer/dept/list
@SpringBootApplication
@EnableEurekaClient//在服务启动后,自动注册到Eureka注册中心中
//在微服务启动的时候就能去加载我们自定义Ribbon配置的负载均衡类,自定义为跳转5次切换节点
@RibbonClient(name="SPRINGCLOUD-PROVIDER-DEPT",configuration = RuleConfig.class)
public class DeptConsumer_80 {
public static void main(String[] args) {
SpringApplication.run(DeptConsumer_80.class,args);
}
}
启动多个注册中心,服务提供者和80消费端口。
多次刷新访问 localhost/consumer/dept/list
我们可直观的看到页面每刷新五次值会更改
至此 Ribbon自定负载均衡 完成、
Feign是声明式的web service客户端,它让微服务之间的调用变得更简单了,类似controller调用service. SpringCloud集成了Ribbon和Eureka,可在使用Feign时提供负载均衡的http客户端。
Feign,主要是社区版,大家都习惯面向接口编程。这个是很多开发人员的规范。调用微服务访问两种方法
1、微服务名字 【ribbon】
2、接口和注解 【feign】
在Feign的实现下,我们只需要创建一个接口并使用注解的方式来配置它 (类似以前Dao接口上标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解),即可完成对服务提供方的接口绑定,简化了使用Spring Cloud Ribbon 时,自动封装服务调用客户端的开发量。
Ribbon和Feign都是用于调用其他服务的,不过方式不同。
Ribbon RestFul风格
Feign 面向接口
1.启动类使用的注解不同,Ribbon用的是@RibbonClient,Feign用的是@EnableFeignClients。
2.服务的指定位置不同,Ribbon是在@RibbonClient注解上声明,Feign则是在定义抽象方法的接口中使用@FeignClient声明。
3.调用方式不同,Ribbon需要自己构建http请求,模拟http请求然后使用RestTemplate发送给其他服务,步骤相当繁琐。
Feign则是在Ribbon的基础上进行了一次改进,采用接口的方式,将需要调用的其他服务的方法定义成抽象方法即可,不需要自己构建http请求。不过要注意的是抽象方法的注解、方法签名要和提供服务的方法完全一致。
1、创建springcloud-consumer-fdept-feign模块
2、填写pom.xml
org.springframework.cloud
spring-cloud-starter-feign
1.4.6.RELEASE
3、DeptController.java
import com.kuang.springcloud.pojo.Dept;
import com.kuang.springcloud.service.DeptClientService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class DeptController {
@Autowired
private DeptClientService service;
@RequestMapping("/consumer/dept/add")
public boolean add(Dept dept) {
return service.addDept(dept);
}
@GetMapping("/consumer/dept/get/{id}")
public Dept get(@PathVariable("id") Long id) {
return service.queryById(id);
}
@RequestMapping("/consumer/dept/list")
public List list() {
return service.queryAll();
}
}
4、Feign和Ribbon二者对比,前者显现出面向接口编程特点,代码看起来更清爽,而且Feign调用方式更符合我们之前在做SSM或者SprngBoot项目时,Controller层调用Service层的编程习惯!
@SpringBootApplication
@EnableEurekaClient
// feign客户端注解,并指定要扫描的包以及配置接口DeptClientService
@EnableFeignClients(basePackages = {"com.kuang.springcloud"})
// 切记不要加这个注解,不然会出现404访问不到
//@ComponentScan("com.haust.springcloud")
public class FeignDeptConsumer_80 {
public static void main(String[] args) {
SpringApplication.run(FeignDeptConsumer_80.class, args);
}
}
5、写springcloud-api模块
添加fegin依赖
org.springframework.cloud
spring-cloud-starter-feign
1.4.6.RELEASE
6、编写service接口
// @FeignClient:微服务客户端注解,value:指定微服务的名字,这样就可以使Feign客户端直接找到对应的微服务
@FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT")
public interface DeptClientService {
@GetMapping("/dept/get/{id}")
public Dept queryById(@PathVariable("id") Long id);
@GetMapping("/dept/list")
public Dept queryAll();
@GetMapping("/dept/add")
public Dept addDept(Dept dept);
}
复杂分布式结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免的失效
服务降级
服务熔断
服务限流
接近实时的监控
·····
Hystrix官网资料=> https://github.com/Netflix/Hystrix/wiki
当一切正常时,请求流可以如下所示
当许多后端系统中有一个潜在阻塞服务时,它可以阻止整个用户请求:
服务熔断是什么
熔断机制是对应雪崩效应的一种微服务链路保护机制。
当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。当检测到该节点微服务调用响应正常后恢复调用链路。在SpringCloud框架里熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的状况, 当失败的调用到一定阈值,缺省是5秒内20次调用失败就会启动熔断机制。
服务熔断解决如下问题:
1、当所依赖的对象不稳定时,能够起到快速失败的目的;
2、快速失败后,能够根据一定的算法动态试探所依赖对象是否恢复。
熔断机制的注解是@HystrixCommand.
新建springcloud-provider-dept-hystrix-8001模块并拷贝springcloud-provider-dept–8001内的pom.xml
org.springframework.cloud
spring-cloud-starter-hystrix
1.4.6.RELEASE
调整yml配置文件
server:
port: 8001
# mybatis配置
mybatis:
type-aliases-package: com.kuang.springcloud.pojo
config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath:mybatis/mapper/*.xml
# spring配置
spring:
application:
name: springcloud-provider-dept
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/db01?userSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: 123
# Eureka的配置,服务注册到哪里
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
instance:
instance-id: springcloud-provider-dept-hystrix-8001 # 修改eureka上的默认描述信息
ip-address: true
# info配置
info:
app.name: kaungshen-springcloud
company.name: blog.kuangstudy.com
修改controller
import com.kuang.springcloud.pojo.Dept;
import com.kuang.springcloud.service.DeptService;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
public class DeptController {
@Autowired
private DeptService deptService;
@GetMapping("/dept/get/{id}")
@HystrixCommand(fallbackMethod = "hystrixGet")
public Dept queryById(@PathVariable("id") Long id) {
Dept dept = deptService.queryById(id);
if (dept == null) {
throw new RuntimeException("id => " + id + ",不存在该用户,或者无法找到");
}
return dept;
}
//备选方法
public Dept hystrixGet(@PathVariable("id") Long id) {
return new Dept().setDeptno(id)
.setDename("id => " + id + "没有对应的信息,null--@Hystrix")
.setDb_source("no this database in mysql");
}
}
为主启动类添加对熔断的支持注解@EnableCircuitBreaker
//启动类
@SpringBootApplication
@EnableEurekaClient //在服务启动后,自动注册到Eureka中
@EnableDiscoveryClient //服务发现
@EnableCircuitBreaker //添加对熔断的支持
public class DeptProviderHystrix_8001 {
public static void main(String[] args) {
SpringApplication.run(DeptProviderHystrix_8001.class, args);
}
//增加一个 Servlet
@Bean
public ServletRegistrationBean hystrixMetricsStreamServlet() {
ServletRegistrationBean registrationBean = new ServletRegistrationBean(new HystrixMetricsStreamServlet());
registrationBean.addUrlMappings("/actuator/hystrix.stream");
return registrationBean;
}
}
启动 7001 7002 7003注册中心,可启动1-2个。启动hystrix80端口
访问 localhost:8001/dept/get/id值
输入不存在的id,可以看到
我们可以清楚的看到 当查询不存在的id时,将会自动采取Hystrix的备选方案去处理值。
application如下配置后,eureka注册中心会显示出链接的真实ip地址,而不再是desptop …链接 默认是:不显示 false
prefer-ip-address: true #改为true后 Eureka中的status就会显示真实ip地址
所谓降级,就是当某个服务出现异常之后,服务器将不再被调用,此时服务端可以自己准备一个本地的fallback回调,返回一个缺省值。
这样做,虽然服务水平下降,但好歹可用,比直接挂掉要强
在springcloud-api中或者新建的springcloud-api-feign项目中的service包中创建DeptClientServiceFallbackFactory降级服务类
//Hystrix 降级,当服务端关闭后的提示信息
@Component
public class DeptClientServiceFallbackFactory implements FallbackFactory {
@Override
public DeptClientService create(Throwable throwable) {
return new DeptClientService() {
@Override
public Dept queryById(Long id) {
return new Dept()
.setDeptno(id)
.setDname("id=>" +id+"没有对应的信息,客户端提供了降级的信息,这个服务现在已经关闭")
.setDb_source("已降级 未查找到数据");
}
@Override
public List queryAll() {
return null;
}
@Override
public boolean addDept(Dept dept) {
return false;
}
};
}
}
在DeptClientService中添加服务降级的注解,@FeignClient(value=“xxx”,fallbackFactory=“降级的类”)
@Component
@FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT",fallbackFactory = DeptClientServiceFallbackFactory.class)
public interface DeptClientService {
@GetMapping("/dept/get/{id}")
public Dept queryById(@PathVariable("id") Long id);
@PostMapping("/dept/list")
public List queryAll();
@PostMapping("/dept/add")
public boolean addDept(Dept dept);
}
切换项目,在springcloud-consumer-dept-feign
消费者项目中配置降级的application.yml
server:
port: 80
# Eureka配置
eureka:
client:
register-with-eureka: false # 不向 Eureka注册自己
service-url: # 从三个注册中心中随机取一个去访问
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
# 开启降级feign.hystrix
feign:
hystrix:
enabled: true
启动7001 7002注册中心,启动8001提供者接口。启动当前80端口。
浏览器中输入localhost/consumer/dept/getid/5
我们正常查询到数据
当关闭了8001提供者服务后,再次刷新,页面不会报错。而是会加载出自定义的降级信息
服务熔断:
服务降级:
或者更具体的说:
新建springcloud-consumer-hystrix-dashboard模块–>
添加依赖–>添加主启动类–>添加监控
org.springframework.cloud
spring-cloud-starter-hystrix
1.4.6.RELEASE
org.springframework.cloud
spring-cloud-starter-hystrix-dashboard
1.4.6.RELEASE
org.springframework.cloud
spring-cloud-starter-ribbon
1.4.6.RELEASE
org.springframework.cloud
spring-cloud-starter-eureka
1.4.6.RELEASE
com.haust
springcloud-api
1.0-SNAPSHOT
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-devtools
主启动类
@SpringBootApplication
// 开启Dashboard
@EnableHystrixDashboard
public class DeptConsumerDashboard_9001 {
public static void main(String[] args) {
SpringApplication.run(DeptConsumerDashboard_9001.class,args);
}
}
localhost:9001/hystrix,可以看到监控页面,当前配置还不足以监控,所以需在8001服务端添加配置
切换到 springcloud-provider-dept-hystrix-8001
项目
在DeptProviderHystrix_8001
启动类中 添加 dashboard监控
配置
@SpringBootApplication
@EnableEurekaClient//在服务启动后,自动注册到Eureka注册中心中
@EnableDiscoveryClient //注册进来的微服务,获取一些信息。服务发现,扩展内容
@EnableCircuitBreaker //添加Hystrix服务熔断 断路器的支持
public class DeptProviderHystrix_8001 {
public static void main(String[] args) {
SpringApplication.run(DeptProviderHystrix_8001.class,args);
}
//增加一个servlet,配合dashboard监控使用,固定的代码 http://localhost:8001/actuator/hystrix.stream访问监控
@Bean
public ServletRegistrationBean hystrixMetricsStreamServlet(){
ServletRegistrationBean registrationBean = new ServletRegistrationBean(new HystrixMetricsStreamServlet());
registrationBean.addUrlMappings("/actuator/hystrix.stream");
return registrationBean;
}
}
配置完后,启动注册中心,启动hystrix8001服务端,启动当前9001监控服务。
在页面输入localhost:8001/actuator/hystrix.stream,可以看到监控捕获到的内容
如无任何监控信息,在浏览器输入 localhost:8001/dept/get/1链接,查询一条值信息,可以看到会加载到一些监控信息
localhost:9001/hystrix 要监控的页面地址,时间及标题设置
访问成功后,可以看到一个可视化监控的面板,可以直观的看到一些监控到的信息
在8001服务中多次执行查询,会看到心跳会越来越大。随之也会缩小,波动值也会随之增加/减少
多次访问查询看效果。
Zull包含了对请求的路由(用来跳转的)和过滤两个最主要功能:
其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础,而过滤器功能则负责对请求的处理过程进行干预,是实现请求校验,服务聚合等功能的基础。Zuul和Eureka进行整合,将Zuul自身注册为Eureka服务治理下的应用,同时从Eureka中获得其他服务的消息,也即以后的访问微服务都是通过Zuul跳转后获得。
注意:Zuul服务最终还是会注册进Eureka
提供:代理+路由+过滤 三大功能
官网文档=> https://github.com/Netflix/zuul
Netfix. API流量的数量和多样性有时会导致生产问题迅速出现而没有警告。我们需要一个允许我们快
速改支行为以对这些情况做出反应的系统。
Zuul使用了各种不同类型的过滤器,这使我们能够快速灵活地将功能应用于边缘服务。这些过滤器帮
助我们执行以下功能 :
新建springcloud-zuul模块,并导入依赖
org.springframework.cloud
spring-cloud-starter-zuul
1.4.6.RELEASE
org.springframework.cloud
spring-cloud-starter-hystrix
1.4.6.RELEASE
org.springframework.cloud
spring-cloud-starter-hystrix-dashboar
1.4.6.RELEASE
org.springframework.cloud
spring-cloud-starter-ribbon
1.4.6.RELEASE
org.springframework.cloud
spring-cloud-starter-eureka
1.4.6.RELEASE
com.haust
springcloud-api
1.0-SNAPSHOT
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-devtools
application.yml
server:
port: 9527
spring:
application:
name: springcloud-zuul
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
instance:
instance-id: zuul9527.com # 修改eureka上的默认描述信息
prefer-ip-address: true
info:
app.name: kuang-springcloud
company.name: blog.kuangstudy.com
# 路由网关配置
zuul:
routes:
mydept.serviceId: springcloud-provider-dept
mydept.path: /mydept/**
# 不能再使用这个路径访问了,ignore : 忽略 | “*” 隐藏全部的微服务真实路径
ignored-services: "*"
prefix: /kuang # 公共设置的前缀
主启动类
/**
* @Auther: csp1999
* @Date: 2020/05/20/20:53
* @Description: Zull路由网关主启动类
*/
@SpringBootApplication
@EnableZuulProxy // 开启Zuul
public class ZuulApplication_9527 {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication_9527.class,args);
}
}
测试:
路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础,而过滤器功能则负责对请求的处理过程进行干预,是实现请求校验,服务聚合等功能的基础。
微服务意味着要将单体应用中的业务拆分成一个个子服务, 每个服务的粒度相对较小,因此系统中会出现大量的服务,由于每个服务都需要必要的配置信息才能运行,所以一套集中式的,动态的配置管理设施是必不可少的。SpringCloud提供了ConfigServer来解决这个问题,我们每一个微服务自己带着一个application.yml,那上百的的配置文件要修改起来,岂不是要feng了吗?
注册码云账号 https://gitee.com/。可qq 微信登录
新建仓库 springcloud-config,设置为公开,语言和模板都选择java。开源许可证GPL-3.0,仓库创建后复制当前仓库的SSH隧道地址
在电脑新建文件夹,用GitBash工具 执行 git clone springcloud-config复制的SSH地址,进行拉取仓库内容,拉去后选择yes,因为权限不存在,需要配置当前Git
Git大全 [https://gitee.com/all-about-git
# 显示当前的Git配置
$ git config --list
# 设置提交代码时的用户信息
$ git config --global user.name "[name]"
$ git config --global user.email "[email address]"
复制仓库中的 https 中的地址,直接 在 GitBash中,git clone 复制的地址
此时我们已经拿到远程的代码
拿到远程的代码后,在当前的目录中创建 application.yml 文件,打开yml文件配置
spring:
profiles:
active: dev
---
spring:
profiles: dev
application:
name: springcloud-config-dev
---
spring:
profiles: test
application:
name: springcloud-config-test
将当前编写的application.yml提交到码云上
GitBash打开命令工具
cd 至 springcloud-config
git add . 将文件添加到暂存区
git status 查看状态
git commit -m “一次提交” 本地提交,-m为提交时写的信息
git push origin master 提交到远程的当前路径分枝
新建maven项目=> springcloud-config-server-3344
导入依赖
springcloud-config-server-3344
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-config-server
2.1.1.RELEASE
org.springframework.boot
spring-boot-starter-actuator
配置application.yml
server:
port: 3344
spring:
application:
name: springcloud-config-server
#连接远程的仓库
cloud:
config:
server:
git:
uri: https://gitee.com/xxx/springcloud-config.git #自己远程仓库的https地址
# 通过 config-server可以连接到git,访问其中的资源以及配置~
创建启动类Config_Server_3344
@SpringBootApplication
@EnableConfigServer //开启配置服务
public class Config_Server_3344 {
public static void main(String[] args) {
SpringApplication.run(Config_Server_3344.class,args);
}
}
启动 Config_Server_3344端口
浏览器输入 localhost:3344/application-test.ym
浏览器输入 localhost:3344/application-dev.yml
可以看到已获得git仓库中application.yml的配置
在远程仓库拉取出来的文件中创建 config-client.yml
#启动环境选择的配置
spring:
profiles:
active: dev
#springboot启动多环境的配置
---
server:
port: 8201
#spring的配置
spring:
profiles: dev
application:
name: springcloud-config-client-dev
#Eureka的配置。 服务注册到Eureka中,需要一个路径地址
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka/
---
server:
port: 8202
#spring的配置
spring:
profiles: test
application:
name: springcloud-config-client-test
#Eureka的配置。 服务注册到Eureka中,需要一个路径地址
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka/
将config-client.yml push到远程仓库
GitBash打开命令工具
cd 至 springcloud-config
git add . 将文件添加到暂存区
git status 查看状态
git commit -m “一次提交” 本地提交,-m为提交时写的信息
git push origin master 提交到远程的当前路径分枝
12345678910
新建Maven项目=> springcloud-config-client-3355
导入依赖
springcloud-config-client-3355
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-config
2.1.1.RELEASE
org.springframework.boot
spring-boot-starter-actuator
创建application.yml,并配置
#用户级别的配置 配置去读取谁
spring:
application:
name: springcloud-config-client-3355
创建bootstrap.yml,配置以下内容。注意创建此yml一定要导入springcloud-config的配置依赖
# 系统级别的配置
spring:
cloud:
config:
name: config-client # 需要从git上读取的资源名称,不要后缀
profile: dev #dev环境端口:8201 test环境端口:8202
label: master #需要在git上的哪个分支拿
#连接到3344服务,中转站的形式连接服务端访问远程地址
uri: http://localhost:3344
创建ConfigClientController控制器
//@Value为git上的client-config的值
@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 getConfig(){
return "applicationName: "+applicationName+
"eurekaServer: "+eurekaServer+
"port: "+port;
}
}
创建Config_Client_3355主启动类
@SpringBootApplication
public class Config_Client_3355 {
public static void main(String[] args) {
SpringApplication.run(Config_Client_3355.class,args);
}
}
启动3344服务端
localhost:3344/application-dev.yml 不同的启动环境 查到不同的仓库application.yml的配置信息
localhost:3344/application-test.yml 不同的启动环境 查到不同的查到仓库application.yml的配置信息
都可查询到 git仓库里application.yml相关内容
localhost:3344/config-client-dev.yml 不同的启动环境 查到不同的查询到仓库配置的config-client的信息
在远程仓库拉取出来的文件中创建 config-eureka.yml
#启动环境选择的配置
spring:
profiles:
active: dev
---
server:
port: 7001
#spring的配置
spring:
profiles: dev
application:
name: springcloud-config-eureka-dev
#Eureka配置
eureka:
instance:
hostname: eureka7001.com #Eureaka服务端的实例名称
client:
register-with-eureka: false #表示是否向Eureka注册中心注册自己
fetch-registry: false #如果fetch-registry为false,则表示自己为注册中心
service-url: #监控页面
#单机:点进去参考源码,可看到默认的url端口配置为8761,我们设置为自己的端口。
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
#集群(除自身外 关联其他所有)
defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
---
server:
port: 7001
#spring的配置
spring:
profiles: test
application:
name: springcloud-config-eureka-test
#Eureka配置
eureka:
instance:
hostname: eureka7001.com #Eureaka服务端的实例名称
client:
register-with-eureka: false #表示是否向Eureka注册中心注册自己
fetch-registry: false #如果fetch-registry为false,则表示自己为注册中心
service-url: #监控页面
#单机:点进去参考源码,可看到默认的url端口配置为8761,我们设置为自己的端口。
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
#集群(除自身外 关联其他所有)
defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
在远程仓库拉取出来的文件中创建 config-dept.yml
#启动环境选择的配置
spring:
profiles:
active: dev
---
server:
port: 8001
#mybatis配置
mybatis:
type-aliases-package: com.lemon.springcloud.pojo
config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath:mybatis/mapper/*.xml
#spring的配置
spring:
profiles: dev
application:
name: springcloud-config-dept-dev
#数据源的配置
datasource:
type: com.alibaba.druid.pool.DruidDataSource #数据源为druid
driver-class-name: com.mysql.jdbc.Driver #数据库驱动
url: jdbc:mysql://localhost:3306/springcloud1?useUnicode=true&characterEncoding=utf-8&servetTimeZone=Asia/Shanghai
username: root
password: 12345678
#Eureka的配置。 服务注册到Eureka中,需要一个路径地址
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/,http://localhost:7003/eureka/
instance:
#修改Eureka中status的默认描述信息。不配置默认为DESKTOP-XXX描述
instance-id: springcloud-provider-dept8001
prefer-ip-address: true #改为true后 Eureka中的status就会显示真实ip地址
#info配置 Eureka的status的xx/info链接点开后的info监控信息。没有太大意义
info:
app.name: ti zi zui bang,jiayou
company.name: tizi.lemon.com
test.name: hahah test
---
server:
port: 8001
#mybatis配置
mybatis:
type-aliases-package: com.lemon.springcloud.pojo
config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath:mybatis/mapper/*.xml
#spring的配置
spring:
profiles: test
application:
name: springcloud-config-dept-test
#数据源的配置
datasource:
type: com.alibaba.druid.pool.DruidDataSource #数据源为druid
driver-class-name: com.mysql.jdbc.Driver #数据库驱动
url: jdbc:mysql://localhost:3306/springcloud2?useUnicode=true&characterEncoding=utf-8&servetTimeZone=Asia/Shanghai
username: root
password: 12345678
#Eureka的配置。 服务注册到Eureka中,需要一个路径地址
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/,http://localhost:7003/eureka/
instance:
#修改Eureka中status的默认描述信息。不配置默认为DESKTOP-XXX描述
instance-id: springcloud-provider-dept8001
prefer-ip-address: true #改为true后 Eureka中的status就会显示真实ip地址
#info配置 Eureka的status的xx/info链接点开后的info监控信息。没有太大意义
info:
app.name: ti zi zui bang,jiayou
company.name: tizi.lemon.com
test.name: hahah test
将创建的文件push到远程仓库中
GitBash打开命令工具
cd 至 springcloud-config
git add . 将文件添加到暂存区
git status 查看状态
git commit -m “一次提交” 本地提交,-m为提交时写的信息
git push origin master 提交到远程的当前路径分枝
创建Maven项目=> springcloud-config-eureka-7001 远程访问仓库实现注册中心
导入pom依赖
springcloud-config-eureka-7001
org.springframework.cloud
spring-cloud-starter-eureka-server
1.4.6.RELEASE
org.springframework.cloud
spring-cloud-starter-config
2.1.1.RELEASE
复制 springcloud-eureka-7001
项目所有的内容,删掉application.yml所有配置,因为此配置已经在git远程仓库中配置,添加以下的配置内容
spring:
application:
name: sorubgckiyd-config-eureka-7001
创建bootstrap.yml 注意创建此yml一定要导入springcloud-config的配置依赖
# 系统级别的配置
spring:
cloud:
config:
name: config-client # 需要从git上读取的资源名称,不要后缀
profile: dev #dev环境端口:8201 test环境端口:8202
label: master #需要在git上的哪个分支拿
#连接到3344服务,中转站的形式连接服务端访问远程地址
uri: http://localhost:3344
启动3344服务端 ,启动后自测。本地需要连接到3344,确定ConfigEureka7001启动后能够连接到远程
localhost:3344/config-eureka-dev.yml
此时 已读取到远程仓库中Eureka的相关信息
启动config-eureka-7001注册中心
创建Maven项目=> springcloud-config-dept-8001 远程访问仓库实现8001服务提供者
复制 springcloud-provider-dept-8001
项目所有的内容及依赖
删掉application.yml所有配置,因为此配置已经在git远程仓库中配置,添加以下的配置内容
spring:
application:
name: springcloud-config-dept-8001
创建bootstrap.yml 注意创建此yml一定要导入springcloud-config的配置依赖
#系统级的配置
# 系统级别的配置
spring:
cloud:
config:
name: config-dept # 需要从git上读取的资源名称,不要后缀
profile: dev #dev环境端口:8201 test环境端口:8202
label: master #需要在git上的哪个分支拿
#连接到3344服务,中转站的形式连接服务端访问远程地址
uri: http://localhost:3344
启动3344服务端 ,config-eureka-7001注册中心,当前8001服务提供者
可以看到,通过远程访问git,也获取到了相应的数据.
到此就结束了,再次声明,此文,只作本人复习使用。如有侵权,请联系我,将妥善处理。