1.能够掌握Eureka注册中心的搭建以及心跳机制
1. 微服务
1.1 了解微服务
1.2 微服务架构
-
dubbo
- rpc远程调用框架,基于tcp协议,性能优于springcloud
-
springcloud
- 不是一个框架,可以将cloud类比于kfc里面的全家桶,里面包含了各式各样的优秀的组件,并且这些组件是使用springboot进行开发的。
-
微服务架构使用dubbo还是cloud?
- dubbo
- 生产者和消费者必须高耦合接口层,同一个语言开发
- dubbo生态圈没有cloud的广泛
- springcloud
- 基于http协议的远程调用,跨语言
- dubbo
1.3 spring/springboot/springcloud区别
- spring
- 为了简化企业级应用开发而产生的。
- aop
- ioc
- 为了简化企业级应用开发而产生的。
- springboot
- 为了简化开发,解放程序员,无xml配置,基于脚手架可以快速的搭建项目
- springcloud
- 为了微服务开发而产生的,并且不是一个框架,而是一个框架的集合(全家桶),里面包含了很多组件,这些组件一般由boot进行开发,cloud更加关注的是服务的治理。
1.4 微服务调用
2. 注册中心
2.1 常见的注册中心
cap理论
- zookeeper
- cp: 数据强一致性
- eureka(目前cloud主要使用产品)
- ap:基本可用性
- apollo
- 携程的产品
- nacos
- 阿里巴巴
- consolu
- springcloud自己的产品
2.2 Eureka
2.2.1 Eureka服务搭建
步骤:
-
创建eureka-server模块
-
添加pom
-
web
-
eureka-server
-
<dependencies> <!--web--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--eureka server--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies>
-
-
创建启动类
-
添加注解@SpringBootApplication
-
声明是一个eureka服务 @EnableEurekaServer
-
@SpringBootApplication @EnableEurekaServer //声明是一个eureka服务 public class EurekaApplication { public static void main(String[] args) { SpringApplication.run(EurekaApplication.class, args); } }
-
-
创建配置文件
-
端口号
-
应用名称
-
注册中心地址
-
server: port: 8761 #eureka server注册中心地址默认端口8761 spring: application: name: eureka-server #应用名称 eureka: client: service-url: #注册中心地址 defaultZone: http://localhost:8761/eureka
-
2.2.2 异常信息解决
异常的原因是由于自己注册至自己的注册中心,但是注册的时候可能服务还没有启动。
server:
port: 8761 #eureka server注册中心地址默认端口8761
spring:
application:
name: eureka-server #应用名称
eureka:
client:
service-url:
#注册中心地址
defaultZone: http://localhost:8761/eureka
fetch-registry: false #是否从注册中心获取注册列表
register-with-eureka: false #是否注册到注册中心
2.2.3 服务注册
步骤:
-
pom
-
eureka-client
-
<!--eureka client--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
-
-
配置文件
-
注册中心地址
-
server: port: 8081 spring: application: name: user-service #注册中心地址 eureka: client: service-url: defaultZone: http://localhost:8761/eureka
-
-
启动类
-
@EnableEurekaClient
-
@SpringBootApplication @EnableEurekaClient //声明是一个eureka客户端 public class UserApplication { public static void main(String[] args) { SpringApplication.run(UserApplication.class, args); } @Bean public RestTemplate restTemplate(){ return new RestTemplate(); } }
-
2.2.4 服务调用
-
用户服务获取订单服务的注册列表
-
/* *此处注意导入的包 *import org.springframework.cloud.client.discovery.DiscoveryClient; */ @Autowired private DiscoveryClient discoveryClient; @GetMapping("getInstances") public List<ServiceInstance> getInstances(){ List<ServiceInstance> instances = discoveryClient.getInstances("order-service"); return instances; }
-
获取到后发现uri可能是主机名
-
解决办法
-
在订单服务的配置文件中声明以ip的方式注册
eureka: instance: prefer-ip-address: true #表示以ip地址注册
-
-
-
-
用户服务调用订单服务
-
/** * @Author: guodong * @Date: 15:34 2021/3/15 * @ClassName: UserController * @Parms [id] * @ReturnType: com.itheima.pojo.Order * @Description: 调用订单服务 */ @GetMapping("findById/{id}") public Order findById(@PathVariable Integer id){ /* 第一种方式: url硬编码 */ String url = "http://localhost:9091/order/findOrderByUserId/" + id; /* 第二种方式: 使用discoveryClient解决url硬编码问题 但是存在多个服务负载均衡问题 服务的应用名称不要使用下划线的方式 */ List<ServiceInstance> instances = discoveryClient.getInstances("order-service"); ServiceInstance serviceInstance = instances.get(0); URI uri = serviceInstance.getUri(); // "uri": "http://192.168.33.40:9091" System.out.println("获取到uri: " + uri); url = uri + "/order/findOrderByUserId/" + id; System.out.println("拼接完毕的url: " + url); return restTemplate.getForObject(url, Order.class); }
-
2.2.6 集群
步骤:
-
修改hosts配置
-
# 372-eureka 127.0.0.1 eureka1 eureka2
-
-
将eureka注册中心配置文件的拉取服务列表以及是否注册至注册中心的配置注释
-
复制两个配置文件
-
server1.yml
-
设置注册中心地址
-
设置hostname
-
server: port: 8761 #eureka server注册中心地址默认端口8761 spring: application: name: eureka-server #应用名称 eureka: client: service-url: #注册中心地址 defaultZone: http://eureka2:8762/eureka instance: hostname: eureka1
-
-
server2.yml
-
设置注册中心地址
-
设置hostname
-
server: port: 8762 #eureka server注册中心地址默认端口8761 spring: application: name: eureka-server #应用名称 eureka: client: service-url: #注册中心地址 defaultZone: http://eureka1:8761/eureka instance: hostname: eureka2
-
-
-
复制两个启动类
-
将主配置文件全部注释
-
启动服务访问查看是否完成了相互注册,并且是否是可用副本
git上面的代码是在搭建完毕集群后将主配置文件恢复了,后面的授课使用eureka单节点
git上面的代码是在搭建完毕集群后将主配置文件恢复了,后面的授课使用eureka单节点
git上面的代码是在搭建完毕集群后将主配置文件恢复了,后面的授课使用eureka单节点