1.springcloud组件有那些?
1)eureka 实现微服务的注册和发现,包含三个部分:服务发现组件、服务的提供者、服务的消费者;
2)ribbon 实现微服务负载均衡;
3)foreign eureka 和ribbon的结合体,实现微服务API 请求的转发和调度;
4)zuul 服务网关,实现路由服务转发,同时具备权限控制功能;
5)histy 熔断器,防止出现服务出现故障时还被持续访问,最终导致自身服务的瘫痪。
6)config 配置中心,用于分布式系统的配置,分为两部分,一是Config Server,二是Config Client。
2.springcloud组件内部具体如何实现?
2.1 eureka实现
服务注册表
是服务发现组件的核心,它用来记录各个微服务的信息,例如微服务的名称、IP、端口等。服务注册表提供查询API和管理API,查询API用于查询可用的微服务实例,管理API用于服务的注册和注销。
2.1.1 服务如何注册
1)注册IP、端口、服务名称
Eureka Server 提供服务发现的能力,各个微服务启动时,会向Eureka Server注册自己的信息(例如IP、端口、微服务名称等),Eureka Server会存储这些信息。
Eureka Client是一个Java客户端,用于简化与Eureka Server的交互。
2)注册表数据同步
默认情况下,Eureka Server同时也是Eureka Client。多个Eureka Server实例,相互之间通过复制的方式,来实现服务注册表中的数据的同步。
2.1.2 如何发现服务
1)获取网络地址、调用接口
服务消费者可从服务发现组件查询服务提供者的网络地址,并使用该地址调用服务提供者的接口;
2)缓存注册表信息
Eureka Client 会缓存服务注册表中的信息。这种方式有一定的优势——首先,微服务无须每次请求都查询Eureka Server 的压力;其次即使Eureka Server所有节点都宕掉,服务消费者依然可以使用缓存中的信息找到服务提供者并完成调用。
2.1.3 服务检查和维护服务链接
1)心跳检查
微服务启动后会周期性(默认30秒)地向Eureka Server发送心跳以续约自己的“租期”。
2)超时注销
如果Eureka Server在一定时间内没有接收到某个微服务实例的心跳,Eureka Server将会注销该实例(默认90秒)。
3)注册表自动刷新
微服务网络地址发生变更(例如实例增减或者IP端口发生变化等)时,会重新注册到服务发现组件。使用这种方式,服务消费者就无须人工修改提供者的网络地址了。
2.1.3 eureka 高可用
Eureka Server可以通过运行多个实例并相互注册的方式实现高可用部署,Eureka Server实例会彼此增量地同步信息,从而确保所有节点数据一致。事实上,节点之前相互注册是Eureka Server的默认行为,前面单节点Eureka Server,额外配置了eureka.client.registerWithEureka=false、eureka.client.fetchRegistry=false。
2.1.4 eureka 安装配置
1) pom.xml配置
eureka server 的配置
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.1.RELEASE</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
</dependencies>
eureka client_1 的配置
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
eureka client_2 的配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
2) application.properties 配置
eureka server的配置
server.port=1111
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/
eureka client_1 的配置
spring.application.name=management-service-v1
server.port=8085
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
eureka client_2 的配置
spring.application.name=management-consumer
server.port=8075
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
3) 注解配置
eureka server的配置
eureka server中的Java代码只需要有这启动类即可,没有其他代码。
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* Created by xxx
*/
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String args[]){
new SpringApplicationBuilder(EurekaServerApplication.class).web(true).run(args);
}
}
eureka client_1的配置
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.web.MultipartAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @author xxx
* 入口程序
*/
@SpringBootApplication
@EnableAutoConfiguration(exclude = {MultipartAutoConfiguration.class})
@EnableDiscoveryClient
public class ManagementApplication {
public static void main(String[] args) {
SpringApplication.run(ManagementApplication.class, args);
}
}
eureka client_2的配置
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* Created by xxx
*/
@SpringBootApplication
@EntityScan
@EnableDiscoveryClient
public class ManagementCoreApplication {
public static void main(String[] args){
SpringApplication springApplication =new SpringApplication(ManagementCoreApplication.class);
springApplication.run(args);
}
}
参考:
https://blog.csdn.net/chen497147884/article/details/79861084