创建springcloud项目

1.先创建一个spring initializr项目

2.接着在mouble创建spring项目 eureka 服务 勾选一个eureka server即可打开eureka 里的resources 后缀修改为 yml文件 接着配置 接着在启动类上加上 @EnableEurekaServer //启用eureka服务端 这样eureka配置好了
eureka yml配置文件中为

server:
  port: 8761
eureka:
  instance:
    hostname: localhsot
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defalutZone: http;//${eureka.instance.hostname}:${server.port}/eureka

3.接着创建生产者 同样 mouble spring项目 勾选web和eureka discovery client 和 config client

org.springframework.cloud
spring-cloud-config-client
2.1.1.RELEASE
同样将resources 里的文件修改为yml文件 接着配置以下 在启动类上加上注解@EnableEurekaClient //启用eureka客户端 启动看是否报错 这样就配置好了
4.接着创建ribbon 消费者 同样 mouble spring项目 勾选 在resources 后缀修改为 yml 在启动类上加@EnableEurekaClient 注解 同时在配置restTemplate
测试、建个消费者的controlelr (第一个图) 和 生产者的 controller (第二个)

5.创建 feign 消费者 同样建法 勾选 然后 修改 yml文件 并加以下
server:
port: 8083

spring:
application:
name: springcloud-feign-order

eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka

再加两个注解 @EnableEurekaClient
@EnableFeignClients
再创建一个maven项目用作 service-api 创建一个接口即可 ,同时在消费者,和生产者依赖service-api

6.在service-api 依赖以下 目的是让spring的注解生效

org.springframework.boot
spring-boot-starter-web
2.1.6.RELEASE

7.在 消费者里加入 新建controller service的接口 controller 注入到service 然后接口继承service-api的service接口 同时加上以下的顶部

在service-api里加入 注意注解要一致

在生产者里 并实现 接口 注意加上相同的注解 生产者实现service-api的接口
启动 成功之后接着进行测试

8.配置熔断器 首先在消费者的service里创建个熔断器的类 并配置以下 加注解 并实现service-api的接口

同时在同service的service加上fallback=*.class 如
在 同的application.yml 中 开启熔断器机制 加入
feign:
hystrix:
enabled: true

9.全局配置中心
(1)首先在github官网 配置文件远程仓库
(2)在将仓库目录克隆到本地,在目录中创建三个配置(环境名:dev开发(development environment)、test测试(testing environment)、pro正式(production environment))
(3)将远程仓库的地址复制到git base here里 所在的文件夹 并右击打开git base here ↓复制地址
↓找到git的命令框
↓克隆
之后 新建三个 yml文件 dev test pro
配置文件名称定义:实例名称-环境名称.yml ↓↓↓
在里边 加上 eureka的配置 之后同样 右击 git base here 提交 ↓
之后创建一个spring的config的项目 勾选以下
Recourse 修改后缀名为 yml文件 并添加
server:
port: 8090
spring:
application:
name: springcloud-config
cloud:
config:
server:
git:
uri: https://github.com/jiangtaoyun/springcloud-all.git # 配置git仓库路径,注意路径为HTTP
search-paths: / # 配置文件路径
username: # git账号 当创建的仓库为private则需要账号密码
password: # 分支密码
label: master

eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
在启动上添加注解
@EnableEurekaClient
@EnableConfigServer 启动 访问 你创建的 yml文件
10.2
使用配置中心 配置得结合bootstrap 使用 所以得修改名字为 生产者 bootstrap.yml 文件 将 端口号 连接mysql,连接eureka 等放到创建好的三个yml里 然后再配置上连接 config的 如下

然后再 在页面直接输入你存入dev的端口号 测试一下即可 这样生产者的config就配好了
生产者的config 配置好了 接下来 配置消费者的 config
10.3 首先跟生产者一样 修改resources的application修改为bootstrap 接着在你新建的三个文件 yml 选择你的消费者的 将端口号 和 连接eureka的放到你所建的yml文件 如下
同样在右击 git base here 用命令存入到远程仓库上 然后 回到idea中的resources加入 spring下的
cloud:
config:
label: master
profile: test
discovery:
enabled: true
service-id: springcloud-config

切记:访问的时候 生产者和消费者 的 profile都得是相同的
11.配置 网关

11.1创建一个spring项目 右击 module

11.2 在启动类上加:@EnableEurekaClient
@EnableZuulProxy
11.3 在resources 里配置
1)端口号
2)实例名
3)eureka
4)zuul:
routes:
#消费者的名字自定义
api-a:
#请求转发的路径路径名自定义 代表请求的方法
path: /api-a/

#指定消费的实例名称
serviceId: springcloud-pay-ribbon
#可以配置多个路由请求转发
abc:
path: /api-b/**
serviceId: springcloud-feign

接着新建一个ZuulFilters 类去继承ZuulFilter 重写四个方法 如下

package com.jk.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Component
public class ZuulFilters extends ZuulFilter {
/*
filterType:返回一个字符串代表过滤器的类型,在zuul中定义了四种不同生命周期的过滤器类型,具体如下:
pre:路由之前 ,先执行过滤器再执行后台方法
routing:路由之时, 执行完后台方法在执行过滤器
post: 路由之后, 执行完后台方法在执行过滤器
error:发送错误调用,如果请求正常没有错误,则不需要执行业务逻辑判断
*/

@Override
public String filterType() {
    System.out.println("第一个过滤请求的类型。。" + System.currentTimeMillis());
    return "routing";
}
//过滤的顺序
@Override
public int filterOrder() {
    System.out.println("过滤的顺序");
    return 0;
}
//这里可以写逻辑判断,是否要过滤,true,永远过滤
@Override
public boolean shouldFilter() {
    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;
}

}

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐