spring cloud 实战项目搭建

 

Spring Cloud简介

 

Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一种简单的开发方式。

Spring Cloud包含了多个子项目(针对分布式系统中涉及的多个不同开源产品),比如:Spring Cloud Config、Spring Cloud Netflix、Spring Cloud CloudFoundry、Spring Cloud AWS、Spring Cloud Security、Spring Cloud Commons、Spring Cloud Zookeeper、Spring Cloud CLI等项目。

1.搭建eureka服务

 

       1.1 创建springboot项目

 http://start.spring.io/ 自定义spring boot在线maven构建工具很方便

 

 

1.2 修改pom文件,添加spring cloud 依赖如下

<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		 
		 <dependency>
		    <groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka-server</artifactId>
		 </dependency>
	</dependencies>
	
	<dependencyManagement>
	    <dependencies>
	        <dependency>
			    <groupId>org.springframework.cloud</groupId>
			    <artifactId>spring-cloud-dependencies</artifactId>
			    <version>Dalston.RELEASE</version>
			    <type>pom</type>
			    <scope>import</scope>
			</dependency>
	    </dependencies>
	</dependencyManagement><version>Dalston.RELEASE</version>
			    <type>pom</type>
			    <scope>import</scope>
			</dependency>
	    </dependencies>
	</dependencyManagement>

 代码中加红的部分是对应的版本

如果 spring boot的版本是 1.4之前 对应的版本是Brixton.RELEASE,1.4之后 对应的Dalston.RELEASE版本如果对应不起来会报错

 

 

1.3 在启动类上加上注解 如下

@EnableEurekaServer
@SpringBootApplication
public class SpringCloudApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringCloudApplication.class, args);
	}
}
@SpringBootApplication
public class SpringCloudApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringCloudApplication.class, args);
	}
}

1.4 配置文件application.properties

 

#端口号
server.port=1111
# eureka.client.registerWithEureka :表示是否将自己注册到Eureka Server,默认为true。
# 由于当前这个应用就是Eureka Server,故而设为false  
eureka.client.register-with-eureka=false
# eureka.client.fetchRegistry :表示是否从Eureka Server获取注册信息,默认为true。因为这是一个单点的Eureka Server,
# 不需要同步其他的Eureka Server节点的数据,故而设为false。  
eureka.client.fetch-registry=false
# eureka.client.serviceUrl.defaultZone :设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。默认是
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/

配置好了以后启动  访问 http://localhost:1111/ 就出现了spring cloud 管理中心

 

2.搭建服务端

    2.1 创建springboot项目同上

 

    2.2 修改pom文件,添加spring cloud 依赖如下

 

        <parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.9.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>
		<dependency>
		  	<groupId>org.springframework.cloud</groupId>
		  	<artifactId>spring-cloud-starter-config</artifactId>
		</dependency>
		<!-- sping cloud 注册服务 --> 
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>  
            <groupId>org.springframework.boot</groupId>  
            <artifactId>spring-boot-starter-web</artifactId>  
        </dependency>
	</dependencies>
	
	<dependencyManagement>
	    <dependencies>
	        <dependency>
			    <groupId>org.springframework.cloud</groupId>
			    <artifactId>spring-cloud-dependencies</artifactId>
			    <version>Dalston.RELEASE</version>
			    <type>pom</type>
			    <scope>import</scope>
			</dependency>
	    </dependencies>
	</dependencyManagement>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

2.3 在启动类上加上注解 如下

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class SpringServiceApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringServiceApplication.class, args);
	}
}

2.4 配置文件application.properties

#服务名称
spring.application.name=compute-service1
#端口号
server.port=2222
#注册中心
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
spring.cloud.config.discovery.enabled=true
#注册中心的服务id
spring.cloud.config.discovery.serviceId=compute-server

    2.5启动项目后如下图    

红框内就是启动的项目,显示的是服务的id和端口号

 

 

3 spring cloud 路由网关服务

 

 

    3.1 创建 spring boot项目 同上

    3.2 修改pom文件,添加spring cloud 依赖如下

    <groupId>com.xue</groupId>
	<artifactId>sring-zuul</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>sring-zuul</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.9.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zuul</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
	</dependencies>
	 <dependencyManagement>
	    <dependencies>
	        <dependency>
			    <groupId>org.springframework.cloud</groupId>
			    <artifactId>spring-cloud-dependencies</artifactId>
			    <version>Dalston.RELEASE</version>
			    <type>pom</type>
			    <scope>import</scope>
			</dependency>
	    </dependencies>
	</dependencyManagement>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

   

3.3 在启动类上加上注解 如下

        

@EnableZuulProxy
@EnableEurekaClient
@SpringBootApplication
public class SringZuulApplication {

	public static void main(String[] args) {
		SpringApplication.run(SringZuulApplication.class, args);
	}
}

   

3.4 配置文件application.properties

     

eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
server.port=3333
spring.application.name=service-zuul
#表示只要访问以/api-a/开头的多层目录都可以路由到 id为compute-service1的服务上
zuul.routes.compute-service1=/api-a/**

#表示只要访问以/api-a/开头的多层目录都可以路由到 id为compute-service1的服务上
zuul.routes.compute-service1=/api-a/**
上面的一行等同于下面的两行
zuul.routes.api-a.path=/api-a/**
zuul.routes.api-a.serviceId=compute-service1

通配符含义举例解释
?匹配任意单个字符/feign-consumer/?匹配/feign-consumer/a,/feign-consumer/b,/feign-consumer/c等
*匹配任意数量的字符/feign-consumer/*匹配/feign-consumer/aaa,feign-consumer/bbb,/feign-consumer/ccc等,无法匹配/feign-consumer/a/b/c
**匹配任意数量的字符/feign-consumer/*匹配/feign-consumer/aaa,feign-consumer/bbb,/feign-consumer/ccc等,也可以匹配/feign-consumer/a/b/c

    3.4 启动项目 测试

 

   3.5服务过滤

zuul不仅只是路由,并且还能过滤,做一些安全验证。继续改造工程;

@Component
public class MyFilter extends ZuulFilter{

    private static Logger log = LoggerFactory.getLogger(MyFilter.class);
    @Override
    public String filterType() {
        return "pre";
    }

    @Override
    public int filterOrder() {
        return 0;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        log.info(String.format("%s >>> %s", request.getMethod(), request.getRequestURL().toString()));
        Object accessToken = request.getParameter("token");
        if(accessToken == null) {
            log.warn("token is empty");
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(401);
            try {
                ctx.getResponse().getWriter().write("token is empty");
            }catch (Exception e){}

            return null;
        }
        log.info("ok");
        return null;
    }
}
  • filterType:返回一个字符串代表过滤器的类型,在zuul中定义了四种不同生命周期的过滤器类型,具体如下: 
    • pre:路由之前
    • routing:路由之时
    • post: 路由之后
    • error:发送错误调用
    • filterOrder:过滤的顺序
    • shouldFilter:这里可以写逻辑判断,是否要过滤,本文true,永远过滤。
    • run:过滤器的具体逻辑。可用很复杂,包括查sql,nosql去判断该请求到底有没有权限访问。

 

总结

项目源码地址: springcloud项目源码

 

 

 

  • 11
    点赞
  • 101
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Spring Cloud Alibaba 是阿里巴巴提供的基于 Spring Cloud 的开源框架,用于构建微服务架构的应用程序。它提供了一套完整的分布式系统解决方案,包括服务注册与发现、配置管理、负载均衡、熔断器、限流器等核心组件,为开发者提供了高可用、高可靠、高性能的微服务开发环境。 要学习 Spring Cloud Alibaba 并应用于项目实战,可以按照以下步骤进行: 1. 学习基础知识:先了解 Spring Cloud 和 Alibaba 的相关概念和技术栈,包括 Spring Cloud Netflix、Spring Cloud Gateway、Nacos、Sentinel 等。 2. 搭建环境:根据项目需求,选择合适的开发工具和环境,如 IntelliJ IDEA、Eclipse、Maven、JDK 等,并配置好相关依赖。 3. 创建微服务应用:通过 Spring Initializr 创建一个基础的 Spring Boot 项目,并添加 Spring Cloud Alibaba 的相关依赖。 4. 配置服务注册与发现:使用 Nacos 注册中心,将微服务的信息注册到 Nacos 中,并实现服务之间的调用和发现。 5. 配置负载均衡:通过使用 Spring Cloud LoadBalancer 和 Nacos 客户端实现负载均衡,在多个实例之间分配请求负载。 6. 实现断路器和限流:使用 Sentinel 来实现服务的熔断和限流,保护系统免受高并发的冲击。 7. 使用分布式配置:通过 Nacos 实现配置中心,将应用程序的配置文件统一管理,并自动刷新配置。 8. 实现服务网关:使用 Spring Cloud Gateway 构建统一的入口,对外提供简化的 API,并进行请求过滤、路由转发等功能。 9. 监控和追踪:使用 SkyWalking 对微服务的性能和健康状态进行监控,并进行错误追踪和分析。 10. 测试和部署:编写测试用例,对微服务进行单元测试和集成测试,并使用 Docker、Kubernetes 等容器技术进行部署和管理。 通过以上步骤的学习和实践,逐步掌握 Spring Cloud Alibaba 的核心组件和功能,就可以从入门到项目实战了。但需要注意的是,只有持续学习和实践,并结合实际项目需求,才能不断提升自己在 Spring Cloud Alibaba 上的能力和经验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值