SpringCloud概述:
面向服务的架构,是一种程序开发架构的设计思想。它将不同的功能单元使用一个作为独立的程序运行,并且提供访问的入口(将这些单独运行的每个程序称为服务)。
一个SOA架构的web应用程序,是多个服务组成的!!!
SOA架构的思想就是用于实现,程序分布式的。所以我们也可以将SOA架构的思想理解为分布式架构的思想。
SpringCloud作用:
Spring Cloud通过一个注册中心(Eureka),统一管理了整个分布式系统的服务接口。
所有的服务(子系统)在对外提供服务(接口)之前,必须要在注册中心中注册。我们开发人员就可以在注册中心中,查看整个分布式系统的所有服务!!
我们SOA概念中称为服务系统的东西,在Spring cloud有一个新的名字,叫实例(instance,实例系统)!
如何学习SpringCloud:
(1)必须要将Eureka配置成功
(2)实例是如何将服务在Eureka注册的
(3)如何在Eureka查看整个分布式系统所有实例对外提供的服务(发现服务)
(4)实例域实例之间是如何通讯的(远程调用)
1.入门示例
- 1.配置步骤
第一步:配置Eureka服务器
第二步:创建注册服务实例(Eureka客户端-注册服务@EnableEurekaClient)
第三步:创建发现服务实例(Eureka客户端-发现服务@EnableDiscoveryClient)
第四步:实现发现服务实例调用注册服务实例的示例。
1.2.第一部分:配置Eureka服务器(注册中心)
注意事项:
1.Eclipse配置Spring Cloud必须先安装好 spring tool suite 插件。否则配置文件没有提示!!
2.Spring Cloud框架的jar都是由maven或者gradle构建工具获得的。我们主流使用的是Maven。所以创建的maven项目
1.3.第二部分:创建一个注册服务实例instanceServer
1.3.1.创建一个maven项目
1.3.2.生成springboot项目代码(注意事项:必须添加webmvc模块以及Eureka客户端模块)
将生成的项目的pom.xml代码覆盖项目的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>cn.gzsxt.springcloud</groupId> <artifactId>springcloud-demo-02-instanceServer01</artifactId> <version>1.0</version>
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.19.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>
<properties> <java.version>1.8</java.version> <spring-cloud.version>Edgware.SR5</spring-cloud.version> </properties>
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</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>${spring-cloud.version}</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>
</project> |
1.3.3.编写Application入口类
package cn.gzsxt.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class InstanceApplication {
public static void main(String[] args) {
SpringApplication.run(InstanceApplication.class, args);
}
}
1.3.4.编写一个Controller类
package cn.gzsxt.springcloud.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@RequestMapping("/say")
public String say(){
return "hello,springcloud";
}
}
1.3.5.编写application.properties配置类
#指定实例端口
server.port=8080
#指定实例名,springcloud是通过实例名称来寻址服务的
spring.application.name=instanceServer
#指定Eureka服务端访问路径
eureka.client.service-url.defaultZone=http://localhost:5121/eureka
1.3.6.启动实例
注意事项:因为实例是Eureka的客户端,所以启动实例之前,必须要先启动Eureka服务端!
1.4.第三部分:创建一个发现服务实例新实例(调用服务)
说明:将实例1复制一份。修改配置文件,修改为第二个实例
1.4.1.第一步:修改pom.xml配置文件的项目名
1.4.2.第二步:修改application.properties配置文件
#指定实例端口
server.port=8081
#指定实例名,springcloud是通过实例名称来寻址服务的
spring.application.name=instanceClient
#指定Eureka服务端访问路径
eureka.client.service-url.defaultZone=http://localhost:5121/eureka
1.4.3.修改发现服务入门程序注解
@SpringBootApplication
//标记该项目为一个,该实例是一个发现服务的实例
@EnableDiscoveryClient
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
1.4.4.启动实例
1.5.实现instanceClient与instanceServer远程调用
需求:
(1)在instanceServer中,我们暴露一个login的远程restful接口。
(2)instanceClient调用该接口。将数据传递给它。
说明:SpringCloud远程服务调用,有两种实现方式:
(1)Ribbon+RestTemplate,基于restful实现。
其中,Ribbon是一个基于HTTP和TCP客户端的负载均衡器。
(2)Feign
其中,Feign默认启动Ribbon负载均衡。
步骤说明:(1)修改注册服务代码
(2)修改发现服务代码
(3)启动实例,实现服务调用
(4)负载均衡实现。
1.5.1.修改注册服务,注册login登录服务
1.5.2.修改发现服务实例instanceClient
添加ribbon依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
修改Application启动类,标记该实例是发现服务实例:
//1.用于启动Spring boot项目
@SpringBootApplication
//2.用于标识该项目是一个Eureka客户端(发现服务)
@EnableDiscoveryClient
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
//2.创建RestTemplate实例对象,用来远程调用服务
@Bean
@LoadBalanced
创建UserService类
1.5.3.启动实例
说明:依次启动注册中心、服务提供实例、服务发现实例。
1.5.4.基于ribbon负载均衡实现
负载均衡概念:在多个并且相同的服务可用的情况下,通过一定的负载策略,均衡的去调用这些服务,让服务到达一个平衡的状态。
重用的负载策略:轮询、权重、一致性ip等。
基于ribbon负载均衡实现步骤:
(1)创建一个新的注册服务实现instanceServer2。(复制instanceServer即可)
public RestTemplate restTemplate(){
return new RestTemplate();
}
}