Skip to content

第五章 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.负载均衡原理 ​

image.png

2.负载均衡策略 ​

a.简介 ​

image.png

image.png

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