1. 什么是Spring Cloud
- Spring Cloud 是一系列框架的集合
- 利用Spring Boot的简化了开发
2. Spring Cloud 常见模块
- Eureka:注册中心,用于注册所有服务(项目/应用)
- Ribbon:负载均衡,用于搭建集群的。(同一个功能多个tomcat,ribbon帮着选择一个tomcat)
- zuul 网关:确定统一入口,方便进行管理。
- Feign:服务与服务之间调用。类似HttpClient
- Hystrix:熔断器,与正主断了联系,使用备胎。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-278YyL2P-1575617437358)(img/1575593571923.png)]
3.spring cloud版本
- spring cloud 采用 Greenwich版本,对应spring boot 2.1.*版本
4. Eureka 入门
4.1 认识
- Eureka职责:
- 服务注册:服务提供方将服务注册到注册中心
- 服务发现:服务调用方法,从注册中心中,获得需要的服务
- 服务检测:注册中心与服务之间采用心跳检测服务状态
4.2 Eureka 入门案例
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4sUzQpOh-1575617437361)(img/1575601504822.png)]
4.2.1 搭建父项目
- 步骤一:创建项目 cloud_parent(略)
- 步骤二:修改pom.xml文件,确定spring cloud版本
<!--1 确定spring boot的版本-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
</parent>
<!--2 确定版本-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
<spring-cloud-release.version>Greenwich.RELEASE</spring-cloud-release.version>
</properties>
<!-- 3 锁定sprig cloud版本-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud-release.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 4 确定spring cloud私有仓库-->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
4.2.2 搭建注册中心
- 步骤0:创建项目 eureka_demo (略)
- 步骤一:修改pom.xml文件,添加web和 eureka service 依赖
<dependencies>
<!--web起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Eureka服务端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
- 步骤二:创建yml文件,配置端口号、服务名、eureka注册地址
#服务端口号
server:
port: 10086
#服务名称
spring:
application:
name: eureka_demo2
#注册中心地址
eureka:
client:
service-url:
defaultZone: http://localhost:${server.port}/eureka #eureka服务注册地址
register-with-eureka: false #关闭将自己注册到注册中心中
fetch-registry: false #关闭从注册中心获得列表(不拉去其他服务信息)
- 步骤三:创建启动类,添加开启 eureka service 注解 @EnableEurekaService
package com.czxy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* Created by liangtong.
*/
@SpringBootApplication
@EnableEurekaServer //开启eureka服务端
public class EurekaDemo2Application {
public static void main(String[] args) {
SpringApplication.run(EurekaDemo2Application.class ,args);
}
}
4.2.3 搭建服务提供方
- 步骤0:创建提供方项目,eureka_service
- 步骤一:修改pom.xml文件,添加eureka client依赖
<dependencies>
<!--web起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Eureka客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--spring boot监控-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
- 步骤二:创建application.yml文件,配置端口号、服务名、eureka注册中心位置
#端口号
server:
port: 8080
#服务名称
spring:
application:
name: service2
eureka:
client:
service-url:
defaultZone: http://localhost:10086/eureka
- 步骤三:编写启动类,添加启动客户端注解 @EnableEurekaClient
package com.czxy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
/**
* Created by liangtong.
*/
@SpringBootApplication
@EnableEurekaClient
public class Service2Application {
public static void main(String[] args) {
SpringApplication.run(Service2Application.class,args);
}
}
- 步骤四:测试程序
- 测试路径:http://localhost:8080/test
package com.czxy.controller;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Created by liangtong.
*/
@RestController
@RequestMapping("/test")
public class TestController {
@GetMapping
public ResponseEntity<String> test(){
return ResponseEntity.ok("测试数据");
}
}
4.2.4 搭建 服务调用方
- 步骤0:创建调用方项目,eureka_client
- 步骤一:修改pom.xml文件,添加 web、eureka client、spring boot 监控依赖(与eureka_service项目一样)
<dependencies>
<!--web起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Eureka客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--spring boot监控-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
- 步骤二:创建yml文件,(与eureka_service项目相似,有不同端口和服务名)
#端口号
server:
port: 9090
#服务名称
spring:
application:
name: client2
eureka:
client:
service-url:
defaultZone: http://localhost:10086/eureka
- 步骤三:启动类,添加eureka客户端注解,(与eureka_service项目相似,有不同类名)
package com.czxy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
/**
* Created by liangtong.
*/
@SpringBootApplication
@EnableEurekaClient //开启eureka客户端
public class Client2Application {
public static void main(String[] args) {
SpringApplication.run(Client2Application.class,args);
}
}
4.2.5 调用方测试数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XzGz4YkU-1575617437363)(img/1575601488624.png)]
- 步骤一:编写config配置类,用于配置RestTemplate实例
package com.czxy.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; /** * Created by liangtong. */ @Configuration public class HttpConfig { @Bean public RestTemplate restTemplate(){ return new RestTemplate(); } }
- 步骤二:编写DataDao,用于进行远程调用
package com.czxy.dao;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
/**
* Created by liangtong.
*/
@Component
public class DataDao {
@Resource
private RestTemplate restTemplate;
public ResponseEntity<String> data(){
return restTemplate.getForEntity("http://localhost:8080/test",String.class);
}
}
- 步骤三:编写DataController,提供接口进行访问
package com.czxy.controller;
import com.czxy.dao.DataDao;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* Created by liangtong.
*/
@RestController
@RequestMapping("/data")
public class DataController {
@Resource
private DataDao dataDao;
@GetMapping
public ResponseEntity data(){
return dataDao.data();
}
}
- 测试路径
http://localhost:9090/data
4.3 配置eureka instance
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vlHuwh8n-1575617437363)(img/1575603867581.png)]
- yml文件配置
- instance-id : 用于配置可视化页面中,显示的服务名称
- 默认服务名称:计算机名称:服务名:端口号
- 自定义服务名称:
- ${spring.application.name} 获得服务名
- ${spring.cloud.client.ip-address} 获得ip地址
- ${server.port} 获得端口号
- prefer-ip-address:用于配置可视化页面中,访问时是否显示ip地址
- 默认显示的是:计算机名称:端口号/
- instance-id : 用于配置可视化页面中,显示的服务名称
eureka:
client:
service-url:
defaultZone: http://localhost:10086/eureka
instance:
instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
prefer-ip-address: true #注册中心可视化中显示IP地址
- properties文件配置(不建议),参考学习
eureka.client.service-url.defaultZone=http://localhost:10086/eureka
eureka.instance.instance-id=${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
eureka.instance.prefer-ip-address=true