本系列学习教程采用的框架版本:
springboot:2.0.3.RELEASE
sringcloud:Finchley.RELEASE
服务发现:Netflix Eureka
客服端负载均衡:Netflix Ribbon
断路器:Netflix Hystrix
服务网关:Netflix Zuul
分布式配置:Spring Cloud Config
主要内容:
SpringCloud服务注册与发现原理
SpringCloud使用Eureka作为注册中心
搭建高可用Eureka注册中心
SpringCloud使用Consull搭建注册中心
传统RPC远程调用中,服务与服务依赖关系复杂,所以需要使用服务治理来管理服务与服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。
RPC远程调用框架的核心设计思想在于注册中心,使用注册中心管理每个服务与服务之间的依赖关系(服务治理)
如上图,假设订单服务需要调用会员服务查询用户相关信息,订单通过httpclient技术进行调用,这样是没有问题的,但是当一个系统有非常多的服务,并且服务之间相互依赖关系复杂的情况下,会导致服务的URL管理将会非常复杂等很多问题,dubbo官网有很详细的说明:
那么这个时候,服务治理技术就登场了,通过服务治理管理服务之间的依赖关系,并实现本地负载均衡,服务注册与发现,容错等
(1)注册中心概念:在任何一个rpc框架中,都有一个注册中心用来存放服务地址(接口地址)相关信息
springcloud支持三种注册中心:Eureka Consul Zookeeper
(2)相关基本概念:
a. 服务提供者:提供服务接口的一方
b. 服务消费者:调用别人的接口进行使用的一方;一个服务既可以是服务提供者,也可以是服务消费者
c. 服务注册:将服务信息注册到注册中心上
d. 服务发现:从注册中心上获取服务信息
参考dubbo的组件依赖关系:
前面提到的订单服务调用会员服务,在服务治理技术的支撑下,这时候可以变成下面这样一个关系:
在上面的图中,会员服务是服务的提供者,订单服务是会员服务的消费者
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.lchtestgroupId>
<artifactId>springcloud2.0-eureak-serverartifactId>
<version>0.0.1-SNAPSHOTversion>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.0.3.RELEASEversion>
parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>Finchley.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
dependency>
dependencies>
project>
注册中心需要加入的依赖是spring-cloud-starter-netflix-eureka-server
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
dependency>
# 注册中心端口号
server:
port: 8100
eureka:
instance:
hostname: 127.0.0.1
client:
service-url:
#服务的注册地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
# defaultZone: http://localhost:8100/eureka/
# 是否将自己注册到注册中心,只有一个注册中心时选择false,注册中心为集群的时候需要设置为true
#register-with-eureka: false
# 单个注册中心,不需要去检索服务信息
#fetch-registry: false
package com.lchtest.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* springcloud eureka注册中心
* @author pc
*
*/
@SpringBootApplication
// @EnableEureakServer表示开启注册中心
@EnableEurekaServer
public class AppEureka8100 {
public static void main(String[] args) {
SpringApplication.run(AppEureka8100.class, args);
}
}
搭建一个会员服务的项目
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.lchtestgroupId>
<artifactId>springcloud2.0-memberartifactId>
<version>0.0.1-SNAPSHOTversion>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.0.3.RELEASEversion>
parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>Finchley.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
dependencies>
project>
# 会员服务项目端口号
server:
port: 8000
# 服务别名--服务注册到注册中心的名称
spring:
application:
name: member
eureka:
client:
service-url:
#将当前服务注册到eureka注册中心
defaultZone: http://localhost:8100/eureka/
# 将自己注册到注册中心,设置为true
register-with-eureka: true
# 检索服务信息
fetch-registry: true
package com.lchtest.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
// @EnableEurekaClient 将当前服务注册到eureka上
@EnableEurekaClient
public class MemberApp {
public static void main(String[] args) {
SpringApplication.run(MemberApp.class, args);
}
}
package com.lchtest.springcloud.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MemberController {
@Value("${server.port}")
private String port;
@RequestMapping("/getmember")
public String getmember() {
return "this is member service.port=" + port;
}
}