SpringCloud之Eureka2.0服务注册中心
SpringCloud之Eureka2.0服务注册中心
1 了解相关概念
1.1 微服务架构如何拆分
- 微服务架构把每一个职责单一功能存放在独立的服务中
- 每个服务运行在单独的进程中
- 每个服务有自己独立数据库存储、实际上有自己独立的缓存、数据库、消息队列等
1.2 微服务架构与SOA架构区别
- 微服务架构基于SOA架构演变过来,继承SOA架构优点,在微服务架构中去除SOA架构中的ESB消息总线,采用http+json(restful)进行传输。
- 微服务架构比SOA架构粒度会更加精细,让专业的人去做专业的事。
- SOA架构中可能数据存储会发生共享,微服务架构强调每个服务都是单独的数据库,保证每个服务与服务之间互不影响。
1.3 一线简单的概念
1.3.1 服务治理
服务治理: 阿里巴巴开源的Dubbo和当当网在基础上扩展的Dubbox,Eureka,Apache的Consul等
1.3.2 服务注册与发现
RPC远程调用框架核心设计思想:在于注册中心,因为使用注册中心管理每个服务与服务之间的一个依赖关系(服务治理概念)
- 服务注册与服务发现原理,在任何的RPC远程调用框架中,都会有一个注册中心。
- 注册中心的概念:存放服务地址相关信息(接口地址)
SpringCloud中支持一下三种注册中心
Eureka Consul(go语言编写) Zookerper 注意:Dubbo支持两种Redis和Zookeeper
- springcloud组件架构图
2 SpringCloud支持的三种注册中心详解
2.1 Eureka注册中心环境搭建
2.1.1 配置基于单集群的环境
1. 配置pom文件
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
</parent>
<groupId>com.fyzn12</groupId>
<artifactId>springcloud-study-server</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springcloud-study-server Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<java.version>1.8</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- 导入springboot的启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 导入springcloud的启动器-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
注意:SpringCloud与SpringBoot版本具有适配版本适配路径
如上图打开版本适配链接,会开到如图所示的界面,往下面滑动会考到如图所示
2. 添加application.properties文件
# 项目的端口号
server.port=8100
# 服务的注册中心ip
eureka.instance.hostname=127.0.0.1
# 当前服务注册到eureka服务地址
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
# 是否需要将服务注册到eureka注册中心上面,这里本身就是注册中心不需要(但是集群的时候需要为true)
eureka.client.register-with-eureka=false
# 是否需要检索服务
eureka.client.fetch-registry=false
# 运行出bug可添加
spring.main.allow-bean-definition-overriding=true
3. 编写注册中心服务的启动类
/**
* @author fyzn12
* @version 1.0
* @date 2020/7/20 18:55
* @EnableEurekaServer:开启注册服务
* @description:TODO
*/
@SpringBootApplication
@EnableEurekaServer
public class AppEureka {
public static void main(String[] args) {
SpringApplication.run(AppEureka.class,args);
}
}
4.编写会员服务项目
- 配置会员服务项目的pom文件(同上面pom文件配置,需要修改
springcloud-study-server 即可) 添加application.properties文件
# 项目的端口号 server.port=8000 # 服务别名--服务注册到注册中心的名称 spring.application.name=app-test-member # 当前服务注册到eureka服务地址,8100是注册中心服务端端口号 eureka.client.service-url.defaultZone=http://localhost:8100/eureka # 需要将服务注册到eureka上面 eureka.client.register-with-eureka=true # 是否需要检索服务 eureka.client.fetch-registry=true
编写会员服务启动类
/** * @author fyzn12 * @version 1.0 * @date 2020/7/20 21:34 * @description:TODO */ @SpringBootApplication @EnableEurekaClient public class AppTest { public static void main(String[] args) { SpringApplication.run(AppTest.class,args); } }
编写访问接口MemberController
/** * @author fyzn12 * @version 1.0 * @date 2020/7/20 22:57 * @description:TODO */ @RestController public class MemberController { @Value("${server.port}") String port; @RequestMapping("/getMember") public String getMember(){ return "this is a member 我是会员服务,端口号:"+port; } }
5.编写订单服务项目
- 配置会员服务项目的pom文件(同上面pom文件配置,需要修改
springcloud-study-server 即可) 添加application.properties文件
# 项目的端口号 server.port=8001 # 服务别名--服务注册到注册中心的名称 spring.application.name=app-test-order # 当前服务注册到eureka服务地址 eureka.client.service-url.defaultZone=http://localhost:8100/eureka # 需要将服务注册到eureka上面 eureka.client.register-with-eureka=true # 是否需要检索服务 eureka.client.fetch-registry=true spring.main.allow-bean-definition-overriding=true
编写订单服务启动类
/** * @author fyzn12 * @version 1.0 * @date 2020/7/21 9:03 * @description:TODO */ @SpringBootApplication @EnableEurekaClient public class AppOrder { public static void main(String[] args) { SpringApplication.run(AppOrder.class,args); } /** * 解决RestTemplate未能加入到Spring容器中,不能通过注解@Autowired获取bean *@LoadBalanced:该注解能让RestTemplate拥有负载均衡的能力 * */ @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } }
编写访问接口OrderController
/** * @author fyzn12 * @version 1.0 * @date 2020/7/21 9:09 * @description:TODO */ @RestController public class OrderController { /** * RestTemplate是SpringBoot Web组件提供默认整合ribbon负载均衡器 * rest方式 * * */ @Value("${server.port}") String port; @Autowired private RestTemplate restTemplate; @RequestMapping("/getOrder") public String getOrder(){ String url = "http://app-test-member/getMember"; String result = "我是订单服务获取会员服务信息:"+restTemplate.getForObject(url, String.class); System.out.println("订单服务result:"+result); return result; } }
6.测试
2.1.2 配置基于集群的环境
1. 客户端集群
(1) 添加一个member2项目,该项目于member只有application.properties文件中的端口号不同,其余都相同(这里只是模拟)
(2)运行订单项目,访问getOrder地址,查看端口号,测试访问的是那个端口在执行
(3) 项目中使用@LoadBalanced让RestTemplate拥有负载均衡的能力,默认采用轮训的方式去获取客户端。
2. 注册中心集群测试
(1)创建一个项目为springcloud-study-server2
(2)更改application.properties文件
springcloud-study-server的application.properties文件如下
# 项目的端口号
server.port=9100
# 服务的注册中心ip
eureka.instance.hostname=127.0.0.1
# 服务别名--服务注册到注册中心的名称
spring.application.name=app-test-server
# 当前服务注册到eureka服务地址
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:8100/eureka/
# 是否需要将服务注册到eureka注册中心上面,这里本身就是注册中心不需要(但是集群的时候需要为true)
eureka.client.register-with-eureka=true
# 是否需要检索服务
eureka.client.fetch-registry=true
spring.main.allow-bean-definition-overriding=true
springcloud-study-server2的application.properties文件如下
# 项目的端口号
server.port=8100
# 服务的注册中心ip
eureka.instance.hostname=127.0.0.1
# 服务别名--服务注册到注册中心的名称
spring.application.name=app-test-server
# 当前服务注册到eureka服务地址
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:9100/eureka/
# 是否需要将服务注册到eureka注册中心上面,这里本身就是注册中心不需要(但是集群的时候需要为true)
eureka.client.register-with-eureka=true
# 是否需要检索服务
eureka.client.fetch-registry=true
spring.main.allow-bean-definition-overriding=true
(3)启动所有项目
(4)故意停掉springcloud-study-server项目,再次测试
刷新http://localhost:9100/页面之后,大约30秒之后,原来处于http://localhost:8100/注册中心的地址,也刷新到http://localhost:9100/,注册中心服务集群测试成功
2.1.2 Ribbon和Nginx的区别
2.1.3 服务的雪崩效应
2.1.4 服务的隔离
- 上一篇: SpringCloud整合Consul注册中心
- 下一篇: 微服务架构的介绍