适合初学者在 idea 上学习搭建的SpringCloud框架以及各个组件的步骤
配置一个springcloud项目如下:
先创建一个什么都不要选的maven项目,接着就是在maven项目里面依次创建各个模块项目,具体请看以下介绍.
模块例图:
1 .首先要创建一个spring的项目,例如名叫springcloud-eureka的项目,其实也就是注册中心。
在创建项目的时候记得要勾选Spring Cloud Discovery 中的 Eureka Server 。
然后将 application.properties 中的的后缀改成 .yml ,之后就是填写 application.yml 中的配置文件
配置如下:
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false
fetch-registry: false
service-url:
defalutZone: http://${eureka.instance.hostname}:${server.port}/eureka
最后呢,就是在 SpringcloudEurekaApplication 也就是启动类上加上 @EnableEurekaServer
这个注解,在浏览器上成功访问 http://localhost:8761/ 这个路径就说明配置成功了.
2 .创建一个生产者的spring项目,例如名叫springcloud-provider的项目。
- 2.1
在创建项目的时候要勾选三个jar包 :
①:Web中的Spring Web Starter
②:Spring Cloud Discovery 中的Eureka Discovery Client
③:Spring Cloud Config 中的 Config Client - 2.2
将 application.properties 中的的后缀改成 .yml ,之后就是填写 application.yml 中的配置文件.
配置如下:
server:
port: 8762
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
spring:
application:
name: springcloud-provider
- 2.3
在启动类上加@EnableEurekaClient //启用eureka客户端
这样一个生产者也就配置好啦!也可以写一个简单的方法测试一下,看能否跑通.首先创建一个controller层,然后 再写一个测试类( TestController ),在类上加一个@RestController ( 此注解为 @ResponseBody 与 @Controller 的合体注解 ) , 接下来就是写方法 ,如下
//java代码获取配置文件中参数
@Value("${server.port}")
String port;
@Value("${spring.application.name}")
String applicationName;
@RequestMapping("postm/{name}")
public String postMethod(@PathVariable("name") String name){
System.out.println("你好"+ name + ", 你请求的实例:" + applicationName + ", 请求的端口号:" + port);
String result = "你好"+ name + ", 你请求的实例:" + applicationName + ", 请求的端口号:" + port;
return result;
}
如图:
最后就是在浏览器上访问此方法,访问成功说明就配置好啦.
3 . 创建一个feign的spirng项目,也就相当于一个消费者的项目.例如名叫springcloud-feign。
- 3.1
在创建项目的时候要勾选三个jar包 :
①: Web中的Spring Web Starter
②:Spring Cloud Discovery 中的Eureka Discovery Client
③:Spring Cloud Routing 中的 OpenFeign - 3.2
将 application.properties 中的的后缀改成 .yml ,之后就是填写 application.yml 中的配置文件.
配置如下:
server:
port: 8763
spring:
application:
name: springcloud-feign
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
-
3.3
在启动类上加俩个注解:
@EnableEurekaClient
@EnableFeignClients -
3.4
创建一个controller类 和 service 接口并加上注解 @FeignClient(“生产者实例名”) //指定生产者实例名Controller 层例如 :
Service 接口如下 :
@FeignClient(“生产者实例名”) //指定生产者实例名
注意:
接口中的方法和生产者controller中的方法保持一致 ,
包括请求的方式,传入的参数,方法定义和返回参数 !!!
如图:
生产者controller里的方法如下:
最后在浏览器上访问成功,说明feign就配置成功啦.
4 . 创建一个ribbon的spirng项目,也就相当于一个消费者的项目.例如名叫springcloud-ribbon。
- 4.1
在创建项目的时候要勾选三个jar包 :
①: Web中的Spring Web Starter
②: Spring Cloud Discovery 中的Eureka Discovery Client
③: Spring Cloud Routing 中的 Ribbon - 4.2
将 application.properties 中的的后缀改成 .yml ,之后就是填写 application.yml 中的配置文件.
配置如下:
server:
port: 8764
spring:
application:
name: springcloud-ribbon
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
- 4.3
在启动类上加一个注解
@EnableEurekaClient
并添加如下代码:
// 将RestTemplate注入到spring容器中
// LoadBalanced负载均衡默认为轮询
// 通过注入在controller中就可以使用调用生产者实例
@Bean
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate();
}
例图:
- 4.4
创建一个controller 测试一下
实例如下:
这样ribbon 也就配置好啦 .
5 . 创建一个用来存放公共接口的maven项目,例如名叫springcloud-service-api,创建一个接口就好。
注意事项:service-api中的接口请求方式、参数、注解要和生产者重写的方法保持一致
- 5.1
创建一个service接口 例如名叫 : TestServiceApi
然后将 feign消费者 service 接口中的方法都挪到这个TestServiceApi中,同时feign的service接口要继承一下这个TestServiceApi ,例如 :
- 5.2
生产者里面的controller也要实现一下TestServiceApi,或者在feign的service实现类实现一下TestServiceApi,并且加上 @RestController 这个注解 - 5.3
在springcloud-service-api 项目的pom.xml 中加入此jar包 ,目的是让spring的注解生效,如下
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.1.6.RELEASE</version>
</dependency>
</dependencies>
如图 :
- 5.4
生产者 与 消费者 都在pox.xml 里边加入对springcloud-service-api的依赖 。
这个service-api也就配置好啦。
6 .
创建一个用来存放公共实体类的maven项目,例如名如 :springcloud-common
只需创建一个 model 就可以啦,然后在 service-api ,生产者,消费者 中的pom.xml中设置一下依赖就好了.
7 . 配置Hystrix熔断器
- 7.1 创建熔断器类实现并实现service-api接口
- 7.2 添加注解@Compent 与 @RequestMapping("/error") 将熔断器类注入spring容器中
- 7.3 改造feign项目中service中的接口,添加Fallback指定熔断器类,
@FeignClient(value = "springcloud-provider",fallback = TestServiceError.class)
如图 :
- 7.4 开启熔断器机制
添加以下配置,如图 :
- 7.5 在熔断器类中的方法返回相应的错误信息 .
8 .配置SpringCloud Config 全局配置中心
-
8.1 在git上创建配置文件远程仓库
-
8.2 创建一个文件夹,通过执行git命令在将仓库目录克隆到本地(也就是克隆到此文件夹中) ,例:
克隆到本地的Git 命令: git clone后面的地址去github中复制一下 ,例:
- 8.3
在目录中创建三个配置(环境名:dev开发(development environment)、test测试(testing environment)、pro正式(production environment))
下面为生产者,当然消费者也如同生产者一样创建三个配置
例:
配置信息如下:(就是将项目中生产者里的配置信息放到这几个新创建的配置文件中,三个配置中的端口号不能相同,如果需要连接数据库,那些连接数据库的配置文件信息也可以放到新创建的配置文件中)
server:
port: 8771
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
如图:
配置完之后记得要用git命令提交到GitHub上,如下图:
-
8.4
创建config server项目选择Spring Cloud Config 中的Config Server 和Spring Cloud Discovery 中的 Eureka Discover Client, 例如项目名叫springcloud-config -
8.5
在配置中配置信息如下 :
-
8.6
在启动上添加注解
@EnableEurekaClient
@EnableConfigServer -
8.7
配置server client项目,以生产者项目为例(如果新创建的项目则需要选择config client :)
导入pom信息:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
将配置文件的名称改为bootstrap.yml
(消费者同样也得把配置文件得名称改为bootstrap.yml然后进行配置)
- 8.8
配置bootstrap.yml文件
spring:
application:
name: springcloudprovider-login
cloud:
config:
# 分支
label: master
# 环境
profile: test
# config server 服务发现
discovery:
# 开启服务发现
enabled: true
# 配置config server 服务实例
service-id: springcloud-config
如图
最后试着访问一下浏览器:
http://localhost:8081/springcloud-provider/dev
9 . zuul路由网关
- 9.1 创建zuul工程,选择 Web 中的Spring Web Stater ,Spring Cloud Discovery 中的 Eureka Discovery client, Spring Cloud Routing 中的 Zuul .
- 9.2 在启动类上加:@EnableEurekaClient @EnableZuulProxy
- 9.3
在配置文件中配置如下:
1)端口号
2)实例名
3)eureka
4)zuul:
routes:
#消费者的名字自定义
api-a:
#请求转发的路径路径名自定义 代表请求的方法
path: /api-a/
#指定消费的实例名称
serviceId: springcloud-pay-ribbon
#可以配置多个路由请求转发
abc:
path: /api-b/**
serviceId: springcloud-feign
如图:
- 9.4 请求的路径http://localhost:8087/api-a/getNews
- 9.5 过滤请求,在zuul项目新建过滤器类继承ZuulFilter 并添加 @Component
如图:
详情如下:
重写四个方法
/*
filterType:返回一个字符串代表过滤器的类型,在zuul中定义了四种不同生命周期的过滤器类型,具体如下:
pre:路由之前 ,先执行过滤器再执行后台方法
routing:路由之时, 执行完后台方法在执行过滤器
post: 路由之后, 执行完后台方法在执行过滤器
error:发送错误调用,如果请求正常没有错误,则不需要执行业务逻辑判断
*/
@Override
public String filterType() {
System.out.println("第一个过滤请求的类型。。" + System.currentTimeMillis());
return "pre";
}
//过滤的顺序
@Override
public int filterOrder() {
System.out.println("过滤的顺序");
return 0;
}
//这里可以写逻辑判断,是否要过滤,true,永远过滤。
@Override
public boolean shouldFilter() {
System.out.println("是否要过滤");
return true;
}
//过滤器的具体逻辑。可用很复杂,包括查sql,nosql去判断该请求到底有没有权限访问。
@Override
public Object run() throws ZuulException {
System.out.println("业务逻辑处理");
RequestContext requestContext = RequestContext.getCurrentContext();
HttpServletRequest request = requestContext.getRequest();
String url = request.getRequestURL().toString();
String method = request.getMethod();
String flag = request.getParameter("flag");
System.out.println(url);
System.out.println(method);
System.out.println(flag);
Object obj = request.getSession().getAttribute("sessionUser");
if(StringUtils.isEmpty(flag) || obj == null){
try {
requestContext.setSendZuulResponse(false);
requestContext.setResponseStatusCode(401);
HttpServletResponse response = requestContext.getResponse();
//让浏览器用utf8来解析返回的数据
response.setHeader("Content-type", "text/html;charset=UTF-8");
//servlet用UTF-8转码,而不是用默认的ISO8859
response.setCharacterEncoding("utf-8");
response.getWriter().write("请求需要传入flag标识符 或者 用户没有登录");
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
好了,今天就到这儿吧,小伙伴们点赞、收藏、评论,一键三连走起呀,我是老贺,我们下期见~~