第五章 Spring Cloud简介 v1.0
第一部分 Spring Cloud 微服务入门
一、远程调用
1.实现远程调用
a.注册RestTemplate
RestTemplate只能在配置类(如启动类ProjectApplication)中注入并调用,示例如下
java
@SpringBootApplication
pubLic class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
@Bean
pubLic RestTemplate restTemplate(){
return new RestTemplate();
}
}b.服务远程调用RestTemplate
在Server层中调用restTemplate的方法:Object obj = get|postForObject(url, object.class);
java
@Service
pubLic class OrderService {
@Autowired
private RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// TODO 2.查询用户
String url = "http://localhost:8081/user/" + order.getUserId();
User user = restTemplate.getForObject(url, User.class);
// 3.封装user信息
order.setUser(user);
// 4.返回
return order;
}
}2.服务的提供者和消费者
服务提供者:一次业务中,被其他微服务调用的服务(提供接口给其他微服务)
服务消费者:一次业务中,调用其他微服务的服务(调用其他微服务提供的接口)
提供者与消费者角色其实是相对的,一个服务可以同时是服务提供者和服务消费者
二、Eureka注册中心
1.Eureka作用
- 为消费者提供服务提供者具体信息,并通过心跳感知服务提供者健康状态
- 利用负载均衡算法为消费者在多个服务提供者中进行选择
2.搭建注册中心
a.引入依赖
xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>若是使用Spring Initializr初始化项目,勾选Spring Cloud Config->Config Client
b.在启动类中添加@EnableEurekaServer注解
java
@EnableEurekaServer
@SpringBootApplication
public cLass EurekaApplication {
pubLic static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}c.编辑配置信息
yaml
server:
port: 10001 # 服务端端口
spring:
application:
name: eurekaserver # 服务名称
#register-with-eureka: false # 是否注册注册中心
#fetch-registry: false # 是否需要去检索服务
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10001/eureka/ # 地址信息,路径必须包含/eureka/
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/3.服务注册
a.引入依赖
xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>若是使用Spring Initializr初始化项目,勾选Spring Cloud Config->Config Server
b.编辑配置信息
yaml
server:
port: 10001 # 服务端端口
spring:
application:
name: userserver # 服务名称
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10001/eureka/ # 地址信息,路径必须包含/eureka/4.服务发现
服务发现(服务拉取)是基于服务名称获取服务列表,然后再对服务列表做负载均衡
下面以 一、远程注册 中提到的例子为基础进行修改
a.注册RestTemplate,添加负载均衡注解
java
@Bean
@LoadBalanced //添加负载均衡注解
public RestTemplate restTemplate(){
return new RestTemplate();
}b.URL路径中使用服务名代替服务地址与端口
java
@Service
pubLic class OrderService {
@Autowired
private RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2.查询用户,使用服务名代替服务地址与端口
String url = "http://userservice/user/" + order.getUserId();
User user = restTemplate.getForObject(url, User.class);
// 3.封装user信息
order.setUser(user);
// 4.返回
return order;
}
}三、Ribbon负载均衡
1.负载均衡原理

2.负载均衡策略
a.简介


b.修改负载均衡规则
通过定义IRule实现可以修改负载均衡规则,有两种方式:
java
@Bean // 配置灵活,针对全部;但修改时需要重新打包发布
public IRule randomRule(){
return new RondomRule();
}yaml
userservice: # 直观方便,针对某个服务,修改无需重新打包发布;但无法进行全局配置
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则(随机)3.懒加载与饥饿加载
a.懒加载(Ribbon默认)
在第一次访问是创建LoadBalanceClient,请求时间会很长
b.饥饿加载
在项目启动时创建LoadBalanceClient,降低第一次访问的耗时,通过以下配置可以开启饥饿加载
yaml
ribbon:
eager-load:
enabled: true # 开启饥饿加载
#clients: userservice # 指定对userservice服务饥饿加载
clients: # 指定饥饿加载的服务名称
- userservice
- orderservice