SpringCloud极大的简化了分布式系统的开发,实现了微服务的快速部署和灵活应用

SpringCloud主要框架

* 服务发现--Netfix Eureka

* 服务调用--Netfix Feign

* 熔断器--Netfix Hystrix

* 服务网关--Netfix Zuul

* 分布式配置--Spring Cloud Config

* 消息总线--Spring Cloud Bus

注意SpringCloud和SpringBoot版本要一一对应,不然会报错

一。Eureka服务发现

外部的pom.xml

<?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>
<packaging>pom</packaging>
<modules>
<module>tensquare_eureka</module>
</modules> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
</parent> <groupId>com.jinke</groupId>
<artifactId>springboot</artifactId>
<version>1.0-SNAPSHOT</version> <dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.0.3.RELEASE</version>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies> </project>

内部的pom.xml

<?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>springboot</artifactId>
<groupId>com.jinke</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion> <artifactId>tensquare_eureka</artifactId> <dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<version>2.1.2.RELEASE</version>
</dependency>
</dependencies> </project>

application.yml

server:
port: 6868
eureka:
client:
register-with-eureka: false
fetch-registery: false
service-url:
defaultZone: http://127.0.0.1:${server.port}/eureka/

EurekaServer.java

package com.tensquare.eureka;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication
@EnableEurekaServer
public class EurekaServer {
public static void main(String[] args) {
SpringApplication.run(EurekaServer.class);
}
}

直接启动看

二。Eureka服务注册

新建一个module

在pom.xml中增加

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.1.2.RELEASE</version>
</dependency>

application.yml

server:
port: 9004
spring:
application:
name: register
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:6868/eureka/
instance:
prefer-ip-address: true

RegisterApplication.java

package com.example.register;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @SpringBootApplication
@EnableEurekaClient
public class RegisterApplication { public static void main(String[] args) {
SpringApplication.run(RegisterApplication.class, args);
} }

applicaiton跑起来,看结果已经注册成功了

三。服务调用

被调register的LabelController

package com.example.register.controller;

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/label")
@CrossOrigin
public class LabelController { @RequestMapping(value = "/{labelId}", method = RequestMethod.GET)
public String findById(@PathVariable("labelId") String id) {
System.out.println("调用成功");
return "success";
} }

主调register2的ProblerController

package com.example.register2.controller;

import com.example.register2.client.BaseClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; @RestController
@CrossOrigin
@RequestMapping("/problem")
public class ProblemController {
@Autowired
private BaseClient baseClient; @RequestMapping(value = "/label/{labelId}", method = RequestMethod.GET)
public String findByLabelId(@PathVariable String labelId) {
baseClient.findById(labelId);
return "success";
}
}

application

package com.example.register2;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@EnableFeignClients
public class Register2Application { public static void main(String[] args) {
SpringApplication.run(Register2Application.class, args);
} }

BaseClient

package com.example.register2.client;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; @FeignClient("register")
public interface BaseClient { @RequestMapping(value = "/label/{labelId}", method = RequestMethod.GET)
public String findById(@PathVariable("labelId") String labelId);
}

eureka和register、register2服务都分别跑起来

同时可以看到register的控制台输出了“调用成功”,即代表调用其他服务成功

Spring已经实现了负载均衡,即调用服务集群时,会公平的轮流调用其中的服务

四。熔断器

熔断器可以有效避免雪崩现象

当被调服务挂掉以后,会走熔断器里面的内容

调用的服务增加实现类

package com.example.register2.client.impl;

import com.example.register2.client.BaseClient;
import org.springframework.stereotype.Component; @Component
public class BaseClientImpl implements BaseClient {
@Override
public String findById(String labelId) {
System.out.println("熔断器触发了");
return "success";
}
}

application.yml增加

feign:
hystrix:
enabled: true

五。网关

网关的作用就相当于一个中转分发站,接口

新建一个网关

pom.xml

<?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>springboot</artifactId>
<groupId>com.jinke</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion> <artifactId>manager</artifactId> <dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
<version>2.1.2.RELEASE</version>
</dependency>
</dependencies> </project>

application.yml

server:
port: 9011
spring:
application:
name: manager
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:6868/eureka/
instance:
prefer-ip-address: true
zuul:
routes:
register:
path: /register/**
serviceId: register

application

package com.jinke.manager;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy; @SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
public class ManagerApplication {
public static void main(String[] args) {
SpringApplication.run(ManagerApplication.class);
}
}

然后启动服务即可

六。网关过滤

在网关模块新建一个过滤类即可

package com.jinke.manager.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.stereotype.Component; @Component
public class ManagerFilter extends ZuulFilter {
@Override
public String filterType() {
//过滤器类型:之前或之后
return "pre";
} @Override
public int filterOrder() {
//多个过滤器的执行顺序
return 0;
} @Override
public boolean shouldFilter() {
//是否开启该过滤器
return true;
} @Override
public Object run() throws ZuulException {
//如果设置setsendzullResponse(false)表示不再继续执行
System.out.println("已经执行到最后了");
return null;
}
}

七。SpringCloudConfig配置

新建config的module

pom.xml

<?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>springboot</artifactId>
<groupId>com.jinke</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion> <artifactId>config</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
</dependencies>
</project>

application.xml

server:
port: 12000
spring:
application:
name: config
cloud:
config:
server:
git:
uri: https://gitee.com/king1039/springcloud-config.git
username: xxxxxxx@qq.com
password: xxxxxx

application

package com.jinke.config;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer; @SpringBootApplication
@EnableConfigServer
public class ConfigApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigApplication.class);
}
}

服务跑起来,如果提示Authentication is required but no CredentialsProvider has been registered是因为要账号密码验证,在配置文件填上

在git上修改以后,刷新会得到新的结果

下面通过配置来调用服务

新建一个base的module

bootstrap.myl

spring:
cloud:
config:
name: springcloud
profile: config
label: master
uri: http://127.0.0.1:12000

git上的配置文件springcloud-config.yml

server:
port: 9001
spring:
application:
name: base
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:6868/eureka/
instance:
prefer-ip-address: true

开启eureka、config、base三个服务,然后调用

流程就是先读取Git上的配置,然后拉下来,再调用服务

下面来通过bus消息开启监听

config的配置文件application.yml

server:
port: 12000
spring:
application:
name: config
cloud:
config:
server:
git:
uri: https://gitee.com/king1039/springcloud-config.git
username: 821578297@qq.com
password: wl802085
rabbitmq:
host: 172.16.10.221
management:
endpoints:
web:
exposure:
include: bus-refresh

被调的服务配置文件

server:
port: 9001
spring:
application:
name: base
rabbitmq:
host: 172.16.10.221
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:6868/eureka/
instance:
prefer-ip-address: true

修改了被调配置文件后,使用post请求发送一次bus-refresh即可实现消息传递

如果要监听自定义的标签需要增加注解@RefreshScope

代码地址:https://github.com/king1039/SpringCloud.git

欢迎关注我的微信公众号:安卓圈

SpringCloud基础的更多相关文章

  1. 微服务架构案例(05):SpringCloud 基础组件应用设计

    本文源码:GitHub·点这里 || GitEE·点这里 更新进度(共6节): 01:项目技术选型简介,架构图解说明 02:业务架构设计,系统分层管理 03:数据库选型,业务数据设计规划 04:中间件 ...

  2. SpringCloud 基础

    目录 SpringCloud 基础 一.概述 二.服务发现组件 Eureka 1. 介绍 2. 搭建 Maven 父工程 3. 创建 Eureka 集群 4. 创建服务提供方集群 5. 创建服务消费方 ...

  3. SpringCloud基础概念学习笔记(Eureka、Ribbon、Feign、Zuul)

    SpringCloud基础概念学习笔记(Eureka.Ribbon.Feign.Zuul) SpringCloud入门 参考: https://springcloud.cc/spring-cloud- ...

  4. 微服务之SpringCloud基础

    SpringCloud微服务基础 微服务架构--SpringCloud网站架构模式 单点应用/分布式系统面向于服务架构(SOA) /微服务架构web项目三层架构1.控制层2.业务逻辑层3.数据访问层传 ...

  5. SpringCloud基础教程学习记录

    这个学习记录是学习自翟永超前辈的SpringCloud的基础教程. 自己写这个教程的目的主要是在于,想要更凝练总结一些其中的一些实用点,顺便做个汇总,这样自己在复习查看的时候更加方便,也能顺着自己的思 ...

  6. spring-cloud - 基础环境搭建

    spring-cloud中文文档:https://springcloud.cc/ spring-cloud中文导航:http://springcloud.fun/ 文章纯属用于个人学习的一个归纳,哪里 ...

  7. SpringCloud基础组件总结,与Dubbo框架、SpringBoot框架对比分析

    本文源码:GitHub·点这里 || GitEE·点这里 一.基础组件总结 1.文章阅读目录 1).基础组件 Eureka组件,服务注册与发现 Ribbon和Feign组件,实现负载均衡 Hystri ...

  8. SpringCloud基础篇AOP之拦截优先级详解

    前面两篇分别介绍了AOP的基本使用姿势和一些高级特性,当时还遗留了一个问题没有说明,即不同的advice,拦截同一个目标方法时,优先级是怎样的,本篇博文将进行详细分析 同一个切面中,不同类型的advi ...

  9. SpringCloud学习笔记(一、SpringCloud 基础)

    目录: 概述 观察者模式 代理模式 概述: spring系列中使用了大量的设计模式,而最常见的便是这观察者.代理模式,所以在讲解SpringCloud之前我们先学习下这两个最常见的设计模式. 观察者模 ...

随机推荐

  1. Win10 家庭版 VMware 无法启动 解决办法

    引发原因 最近更新了一个补丁 KB4524147 安装后会导致 VM 无法打开(如果你没有安装hyper-v的话) 解决方案 控制面板 -> 程序 -> 查看已安装的更新 -> 找到 ...

  2. Matplotlib同时绘制多张图片

    我现在有一组图片,一共100张图片,每张大小是200*200,即imgs.shape=100*200*200*3 (注意通道数在最后一维). 我需要同时绘制这100张图片,而且每张图片需要写上对应的名 ...

  3. 洛谷P3069 [USACO13JAN]牛的阵容Cow Lineup(尺取法)

    思路 考虑比较朴素的解法,枚举每个长度为\(k+1\)的区间,然后统计区间中出现次数最多的颜色.这样的话复杂度为\(O(n*k)\)的,显然不行. 观察到统计每个区间中出现次数最多的颜色中,可以只用看 ...

  4. Win10系统如何关闭自动更新?

    现在很多电脑的系统都升级到了win10了,win10已经渐渐普及到每个人的电脑中,但是,win10系统有一个功能特别讨人厌,我自认为挺讨厌这个功能的,它就是“自动更新”功能,你可能会说,自动更新不是挺 ...

  5. Java中对象的比较(学习笔记)

    1)详细说明对象的比较方式有哪些? ①对象引用的比较("= ="运算符) "= ="是将对象的引用进行比较,实质是比较两个引用变量是否引用同一个对象.注意的点: ...

  6. Educational Codeforces Round 47 (Rated for Div. 2) G. Allowed Letters

    把原字符看成 $X$,每个位置看成 $Y$,每种字符向每个能去的位置连边,就成了一个二分图完美匹配的问题.现要得到字典序最小,那么就枚举每一位要放什么,然后看放完这种字符,剩下的字符的个数和后面能不能 ...

  7. virtual abstract override

    virtual和abstract都是用来修饰父类的,通过覆盖父类的定义,让子类重新定义. 它们有一个共同点:如果用来修饰方法,前面必须添加public,要不然就会出现编译错误:虚拟方法或抽象方法是不能 ...

  8. MongoDB shell 1 数据库方法

    方法名 描述 db.cloneDatabase() 从指定主机上克隆数据库 db.currentOp() 显示当前正在进行的操作 db.commandHelp() 返回数据库命令的帮助信息 db.cr ...

  9. JS中的let变量和var变量的区别

    let var1 [= value1] [, var2 [= value2]] [, ..., varN [= valueN]]; let允许你声明一个作用域被限制在块级中的变量.语句或者表达式.在F ...

  10. Mac 无法安装安装psutil 报错 error: command '/usr/bin/clang' failed with exit status 1

    psutil是一个特别好用来检查系统资源的一个包, 但是 在Mac安装却总是报错 查看监控系统脚本, 点这里 mac系统版本: Macos Mojave 10.14.3 报错信息如下: WARNING ...