1 基本组件
- 注册中心:Eureka
- 负载均衡:Ribbon
- 声明式调用远程方法:Ribbon
- 熔断、降级、监控:Hystrix
- 网关:zuul
2 学习使用版本
<version>Greenwich.SR2</version>
3 目标 1:准备基础测试环
3.1 结构
3.2 创建父工程
parent
配置依赖管理
<dependencyManagement>
<dependencies>
<!-- 导入 SpringCloud 需要使用的依赖信息 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR2</version>
<type>pom</type>
<!-- import 依赖范围表示将 spring-cloud-dependencies 包中的依赖信息导入 -->
<scope>import</scope>
</dependency>
<!-- 导入 SpringBoot 需要使用的依赖信息 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
3.3创建通用工程
创建实体类com.study.spring.cloud.entity.Employee并生成构造函数和getset方法:
public class Employee {
private Integer empId;
private String empName;
private Double empSalary;
3.4创建提供者工程
加入如下依赖信息:
<dependencies>
<!--引入spring boot依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--引入commom依赖-->
<dependency>
<groupId>com.study.spring.cloud</groupId>
<artifactId>spring-cloud-study-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
创建主启动类:
@SpringBootApplication
public class AtzytMainType {
public static void main(String[] args) {
SpringApplication.run(AtzytMainType.class, args);
}
}
创建 application.yml 配置文件:server.port: 1000
创建 handler 类和方法com.study.spring.cloud.hander.EmployeeHander:
@RestController
public class EmployeeHander {
@RequestMapping("/provider/get/employee/remote")
public Employee getEmployeeRemote() {
return new Employee(555, "tom555"+port, 555.55);
}
}
3.5创建消费者工程
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--引入commom依赖-->
<dependency>
<groupId>com.study.spring.cloud</groupId>
<artifactId>spring-cloud-study-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
创建主启动类:
@SpringBootApplication
public class AtzytMainType {
public static void main(String[] args) {
SpringApplication.run(AtzytMainType.class, args);
}
}
创建配置类com.study.spring.cloud.config.AtzytSpringCloudConfig提供RestTemplate
创建hander类com.study.spring.cloud.hander.HumanResourceHandler:
@RestController
public class HumanResourceHandler {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/consumer/ribbon/get/employee")
public Employee getEmployeeRemote() {
// 远程调用方法的主机地址
String host = "http://localhost:1000";
// 远程调用方法的具体 URL 地址
String url = "/provider/get/employee/remote";
return restTemplate.getForObject(host + url, Employee.class);
}
}
创建 application.yml 配置文件:server.port:4000
4 目标 2:创建 Eureka 注册中心
4.1子目标 1:创建 Eureka 注册中心
加入如下依赖信息:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
创建主启动类:
//启用eureka服务器端功能
@EnableEurekaServer
@SpringBootApplication
public class AtzytMainType {
public static void main(String[] args) {
SpringApplication.run(AtzytMainType.class, args);
}
}
创建 application.yml:
4.2子目标 2:将 provider 注册到eureka
provider加入如下依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
provider配置 application.yml:
启动eureka和provider服务,注册的效果:
5 目标 3:consumer 访问 provider 时使用微,服务名称代替 localhost:1000:
5.1分析
5.2操作
在 consumer 工程加入如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
在 application.yml 中加入如下配置:
在 RestTemplate 的配置方法处使用@LoadBalanced 注解
@Bean
//这个注解让RestTemplate有负载均衡的功能,通过调用Ribbon访问provider集群
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
修改 consumer 工程的 handler 方法:
@RestController
public class HumanResourceHandler {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/consumer/ribbon/get/employee")
public Employee getEmployeeRemote() {
// 远程调用方法的主机地址
// String host = "http://localhost:1000";
// 引入 Eureka 和 Ribbon 后,就可以使用微服务名称替代 IP 地址+端口号
String host = "http://study-provider";
// 远程调用方法的具体 URL 地址
String url = "/provider/get/employee/remote";
return restTemplate.getForObject(host + url, Employee.class);
}
}
6 目标 4:provider 以集群方式启
6.1修改 provider的hander方法
@RestController
public class EmployeeHander {
@RequestMapping("/provider/get/employee/remote")
public Employee getEmployeeRemote(HttpServletRequest request) {
int port = request.getServerPort();
return new Employee(555, "tom555"+port, 555.55);
}
}
6.2provider 以集群方式启动
按照端口号 1000 启动第一个实例
按照端口号 2000 启动第二个实例
按照端口号 3000 启动第三个实例
6.3启动各服务测试效果
eureka注册各服务
测试访问consumer远程调用provider1000端口:
刷新网页2000端口:
2000
刷新网页3000端口:
|