为了账号安全,请及时绑定邮箱和手机立即绑定

SpringCloud项目开发教程:从入门到初级实战

标签:
Spring Cloud
概述

本文提供了SpringCloud项目开发教程,涵盖环境搭建、服务发现与注册、服务网关使用、负载均衡配置、服务容错与断路器等多个方面,帮助开发者快速入门并进行初级实战。

SpringCloud简介与环境搭建

SpringCloud是什么

Spring Cloud是一系列框架的有序集合,它主要基于Spring Boot进行开发,可以快速构建分布式系统。Spring Cloud是整个微服务生态比较流行的解决方案之一,它提供了开发分布式系统的常用工具集,例如配置中心、服务注册与发现、负载均衡、断路器等。

开发环境准备

开发Spring Cloud项目需要安装以下工具:

  • Java开发环境:建议使用Java 8及以上版本。
  • 操作系统:Windows、Linux、macOS均可。
  • 开发工具:IntelliJ IDEA、Eclipse等。

Maven依赖配置

在Spring Boot项目中,我们通过Maven来管理依赖。以下是一个简单的Spring Boot项目中的pom.xml配置示例:

<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>
    <groupId>com.example</groupId>
    <artifactId>spring-cloud-example</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.1.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            <version>2.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>2.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
</project>
服务发现与注册

Eureka服务注册与发现

Eureka是Netflix提供的服务注册与发现组件,它使用了客户端/服务器模型。服务提供者和消费者都会向Eureka Server注册自己,并且定时发送心跳。Eureka Server保存所有注册服务的信息,并提供查询服务。

服务提供者与消费者实例

服务提供者实例

创建一个新的Spring Boot项目,并添加Eureka依赖到pom.xml中:

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

修改src/main/resources/application.yml添加Eureka Server地址:

spring:
  application:
   name: service-provider
 eureka:
   client:
     service-url:
       defaultZone: http://localhost:8761/eureka/

在主应用类中添加@EnableDiscoveryClient注解,开启Eureka客户端支持:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

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

创建一个简单的REST API:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ProviderController {
    @GetMapping("/hello")
    public String sayHello() {
        return "Hello from Service Provider";
    }
}

服务消费者实例

创建一个新的Spring Boot项目,并添加Eureka依赖到pom.xml中:

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

修改src/main/resources/application.yml添加Eureka Server地址:

spring:
  application:
   name: service-consumer
 eureka:
   client:
     service-url:
       defaultZone: http://localhost:8761/eureka/

在主应用类中添加@EnableDiscoveryClient注解,开启Eureka客户端支持:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

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

创建一个简单的REST API来调用服务提供者的接口:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class ConsumerController {
    @Autowired
    private LoadBalancerClient loadBalancer;

    @GetMapping("/consumer")
    public String callService() {
        ServiceInstance serviceInstance = loadBalancer.choose("service-provider");
        String serviceUrl = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/hello";
        RestTemplate restTemplate = new RestTemplate();
        return restTemplate.getForObject(serviceUrl, String.class);
    }
}
服务网关的使用

Zuul介绍与配置

Zuul是Netflix开源的基于Java实现的路由器和服务器,主要功能是将请求路由到相应的服务。Spring Cloud整合了Zuul,可以轻松地将它集成到Spring Cloud项目中。

网关路由规则设置

在项目中添加Zuul依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

配置Zuul的路由规则:

spring:
  application:
   name: service-gateway
 eureka:
   client:
     service-url:
       defaultZone: http://localhost:8761/eureka/

zuul:
  routes:
     service-provider:
       path: /provider/**
       serviceId: service-provider

启用Zuul网关支持:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;

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

现在可以通过网关访问服务提供者的接口:

GET /provider/hello
微服务中的负载均衡

Ribbon使用入门

Ribbon是Netflix开发的基于HTTP和TCP的客户端负载均衡器,它基于Netflix Ribbon组件提供一种简单的方法来构建云服务,Ribbon内置了多种负载均衡算法(轮询、随机、最少连接等)。

负载均衡策略介绍

创建一个新的Spring Boot项目,并添加Ribbon依赖到pom.xml中:

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

在主应用类中添加@EnableDiscoveryClient注解,开启Eureka客户端支持:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

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

创建一个简单的REST API并使用Ribbon进行负载均衡:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;

@RestController
public class RibbonController {
    @Autowired
    private LoadBalancerClient loadBalancer;

    @GetMapping("/ribbon")
    public String callService() {
        List<ServiceInstance> instances = loadBalancer.getInstances("service-provider");
        ServiceInstance serviceInstance = loadBalancer.choose("service-provider");
        String serviceUrl = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/hello";
        RestTemplate restTemplate = new RestTemplate();
        return restTemplate.getForObject(serviceUrl, String.class);
    }
}
服务容错与断路器

Hystrix原理与使用

Hystrix是一个用于处理延迟和容错的开源库,实现了断路器模式。它主要解决的是分布式系统中的延迟容错问题,当服务调用出现故障(例如网络延迟、超时、服务宕机等),Hystrix可以通过断路器模式来避免级联故障,保护系统稳定运行。

断路器机制详解

创建一个新的Spring Boot项目,并添加Hystrix依赖到pom.xml中:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

在主应用类中添加@EnableCircuitBreaker注解,开启断路器支持:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;

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

创建一个简单的REST API并使用Hystrix进行容错处理:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;

@RestController
public class HystrixController {
    @Autowired
    private LoadBalancerClient loadBalancer;

    @GetMapping("/hystrix")
    public String callService() {
        return new HystrixCommand<String>(HystrixCommandGroupKey.Factory.asKey("ServiceGroup")) {
            @Override
            protected String run() throws Exception {
                ServiceInstance serviceInstance = loadBalancer.choose("service-provider");
                String serviceUrl = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/hello";
                RestTemplate restTemplate = new RestTemplate();
                return restTemplate.getForObject(serviceUrl, String.class);
            }
        }.execute();
    }
}
实战项目:构建一个简单的微服务应用

项目需求分析

我们这里的目标是构建一个简单的微服务应用,包含一个服务提供者和一个服务消费者。服务提供者暴露一个REST API,服务消费者通过Eureka注册中心找到服务提供者并调用其API。

服务拆分与实现

创建服务提供者

  1. 创建服务提供者项目:创建一个新的Spring Boot项目,添加Eureka依赖。
  2. 配置Eureka客户端:在application.yml中配置服务名和服务注册中心地址。
  3. 实现服务提供者接口:创建一个简单的REST API。
spring:
  application:
   name: service-provider
 eureka:
   client:
     service-url:
       defaultZone: http://localhost:8761/eureka/
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class ServiceProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceProviderApplication.class, args);
    }
}
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ProviderController {
    @GetMapping("/hello")
    public String sayHello() {
        return "Hello from Service Provider";
    }
}

创建服务消费者

  1. 创建服务消费者项目:创建一个新的Spring Boot项目,添加Eureka依赖。
  2. 配置Eureka客户端:在application.yml中配置服务名和服务注册中心地址。
  3. 实现服务消费者接口:通过Eureka发现服务提供者并调用其API。
spring:
  application:
   name: service-consumer
 eureka:
   client:
     service-url:
       defaultZone: http://localhost:8761/eureka/
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class ServiceConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceConsumerApplication.class, args);
    }
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class ConsumerController {
    @Autowired
    private LoadBalancerClient loadBalancer;

    @GetMapping("/consumer")
    public String callService() {
        ServiceInstance serviceInstance = loadBalancer.choose("service-provider");
        String serviceUrl = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/hello";
        RestTemplate restTemplate = new RestTemplate();
        return restTemplate.getForObject(serviceUrl, String.class);
    }
}

项目运行测试

  1. 启动Eureka注册中心:创建一个新的Spring Boot项目,添加Eureka Server依赖。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}
  1. 启动服务提供者:运行服务提供者项目。

  2. 启动服务消费者:运行服务消费者项目。

  3. 访问服务消费者接口:通过浏览器访问服务消费者的API,检查接口是否正常返回服务提供者的响应。
spring:
  application:
   name: eureka-server
 server:
   port: 8761
 eureka:
   instance:
     hostname: localhost
   client:
     register-with-eureka: false
     fetch-registry: false
   server:
     wait-time-in-ms-when-no-replicas-available: 0

通过以上步骤,我们可以构建一个简单的微服务应用,并通过Eureka注册中心实现服务注册与发现,以及通过服务消费者调用服务提供者的API。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消