一、Eureka
Eureka能够自动注册并发现微服务,然后对服务的状态、信息进行集中管理,这样当我们需要获取其他服务的信息时,我们只需要向Eureka进行查询就可以了。
像这样的话,服务之间的强关联性就会被进一步削弱。
二、服务注册与发现
那么现在我们就来搭建一个Eureka服务器,只需要创建一个新的Maven项目即可,然后我们需要在父工程中添加一下SpringCloud的依赖,这里选用2021.0.1版本(Spring Cloud 最新的版本命名方式变更了,现在是 YEAR.x 这种命名方式,具体可以在官网查看:https://spring.io/projects/spring-cloud#learn
父项目导入依赖:
org.springframework.cloud spring-cloud-dependencies2021.0.1 pom import
接着我们为新创建的项目添加依赖:
org.springframework.cloud spring-cloud-starter-netflix-eureka-server3.1.2
创建启动类:
@SpringBootApplication @EnableEurekaServer public class EurekaApplication { public static void main(String[] args) { SpringApplication.run(EurekaApplication.class, args); } }
修改配置文件:
server: port: 8888 eureka: # 开启之前需要修改一下客户端设置(虽然是服务端 client: # 由于我们是作为服务端角色,所以不需要获取服务端,改为false,默认为true fetch-registry: false # 暂时不需要将自己也注册到Eureka register-with-eureka: false # 将eureka服务端指向自己 service-url: defaultZone: http://localhost:8888/eureka
启动成功:
可以看到目前还没有任何的服务注册到Eureka,我们接着来配置一下我们的三个微服务,首先还是需要导入Eureka依赖(注意别导错了,名称里面有个starter的才是):
org.springframework.cloud spring-cloud-starter-netflix-eureka-client
修改配置文件:
eureka: client: # 跟上面一样,需要指向Eureka服务端地址,这样才能进行注册 service-url: defaultZone: http://localhost:8888/eureka
给客户端起名:
spring: application: name:
当我们的服务启动之后,会每隔一段时间跟Eureka发送一次心跳包,这样Eureka就能够感知到我们的服务是否处于正常运行状态。
我们之前如果需要对其他微服务进行远程调用,那么就必须要知道其他服务的地址:
User user = template.getForObject("http://localhost:8082/user/"+uid, User.class);
而现在有了Eureka之后,我们可以直接向其进行查询,得到对应的微服务地址,这里直接将服务名称替换即可:
BeanConfiguration
我们手动将RestTemplate声明为一个Bean,然后添加@LoadBalanced注解,这样Eureka就会对服务的调用进行自动发现,并提供负载均衡:
package com.example.config; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration public class BeanConfiguration { @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } }
BorrwoServiceImpl
有了Eureka之后,我们可以直接向其进行查询,得到对应的微服务地址,这里直接将服务名称替换即可:
@Service public class BorrowServiceImpl implements BorrowService { @Resource private BorrowMapper borrowMapper; @Resource private RestTemplate template; @Override public UserBorrowDto getUserBorrowDtoByUid(Integer uid) { Listborrow = borrowMapper.getBorrowByUid(uid); //这里通过调用getForObject来请求其他服务,并将结果自动进行封装 //获取User信息 User user = template.getForObject("http://userservice/user/getUserById/" + uid, User.class); //获取每一本书的详情信息 List bookList = borrow .stream() .map(b -> template.getForObject("http://bookservice/book/getBookById/" + b.getId(), Book.class)) .collect(Collectors.toList()); return new UserBorrowDto(user,bookList); } }
我们先来看看,同一个服务器实际上是可以注册很多个的,但是它们的端口不同,比如我们这里创建多个用户查询服务,我们现在将原有的端口配置修改一下,由IDEA中设定启动参数来决定,这样就可以多创建几个不同端口的启动项了:
这样,服务自动发现以及简单的负载均衡就实现完成了,并且,如果某个微服务挂掉了,只要存在其他同样的微服务实例在运行,那么就不会导致整个微服务不可用,极大地保证了安全性。
三、高可用配置
虽然Eureka能够实现服务注册和发现,但是如果Eureka服务器崩溃了,岂不是所有需要用到服务发现的微服务就GG了?
为了避免,这种问题,我们也可以像上面那样,搭建Eureka集群,存在多个Eureka服务器,这样就算挂掉其中一个,其他的也还在正常运行,就不会使得服务注册与发现不可用。
搭建Eureka集群,这里由于机器配置不高,就搭建两个Eureka服务器组成集群。
首先我们需要修改一下Eureka服务端的配置文件,这里我们创建两个配置文件,:
server: port: 8801 spring: application: name: eurekaserver eureka: instance: # 由于不支持多个localhost的Eureka服务器,但是又只有本地测试环境,所以就只能自定义主机名称了 # 主机名称改为eureka01 hostname: eureka01 client: fetch-registry: false # 去掉register-with-eureka选项,让Eureka服务器自己注册到其他Eureka服务器,这样才能相互启用 service-url: # 注意这里填写其他Eureka服务器的地址,不用写自己的 defaultZone: http://eureka02:8802/eureka
server: port: 8802 spring: application: name: eurekaserver eureka: instance: hostname: eureka02 client: fetch-registry: false service-url: defaultZone: http://eureka01:8801/eureka
这里由于我们修改成自定义的地址,需要在hosts文件中将其解析到172.0.0.1才能回到localhost,Mac下文件路径为/etc/hosts,Windows下为C:\Windows\system32\drivers\etc\hosts:
接着我们需要将我们的微服务配置也进行修改:
eureka: client: service-url: # 将两个Eureka的地址都加入,这样就算有一个Eureka挂掉,也能完成注册 defaultZone: http://localhost:8801/eureka, http://localhost:8802/eureka
猜你喜欢
- 16小时前Kafka系列 - Kafka一篇入门
- 16小时前JavaMySql+hadoop高校固定资产管理系统 74965(免费领源码)计算机毕业设计选题推荐上万套实战教程JAVA、PHP,node.js,C++、python等
- 14小时前手机掉厕所怎么办(手机掉蹲厕里了应该怎么处理)
- 11小时前美赞臣亲舒(美赞臣亲舒水解奶粉可以长期吃吗)
- 9小时前即日是什么意思(即日是词语吗)
- 9小时前柏多音字组词(柏多音字组词是什么)
- 7小时前桂林航天工业学院(桂林航天工业学院图书馆官网)
- 6小时前xp3用什么模拟器打开(xp模拟器怎么用)
- 5小时前完整的西瓜可以放多久(完整的西瓜一般可以放多久)
- 1小时前王者荣耀赛季多久更新(王者荣耀赛季多久更新一次?)
网友评论
- 搜索
- 最新文章
- 热门文章