您现在的位置是:首页 >技术交流 >Eureka网站首页技术交流
Eureka
简介Eureka
前置
把一个完整项目拆成多个微服务项目,不同微服务之间独立开发,部署
- 登录验证服务:用于处理用户注册、登录、密码重置等,反正就是一切与账户相关的内容,包括用户信息获取等。
- 图书管理服务:用于进行图书添加、删除、更新等操作,图书管理相关的服务,包括图书的存储等和信息获取。
- 图书借阅服务:交互性比较强的服务,需要和登陆验证服务和图书管理服务进行交互。
springboot项目结构图
[外链图片转存中…(img-BeBI7jTt-1685195320263)]
springcloud项目结构图
实体类实现在不同项目中公用,放在mycommons项目中,在其他项目导入mycommons依赖来使用它
<dependency>
<groupId>com.example</groupId>
<artifactId>mycommons</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
Eureka
[译:找到了] 一个集中管理微服务的平台, 自动注册并发现微服务
创建myeureka 项目
父项目添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2021.0.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
myeureka项目添加依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
myeureka主类
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
myeureka yml
server:
port: 8888
eureka:
# 开启之前需要修改一下客户端设置(虽然是服务端
client:
# 由于我们是作为服务端角色,所以不需要获取服务端,改为false,默认为true
fetch-registry: false
# 暂时不需要将自己也注册到Eureka
register-with-eureka: false
# 将eureka服务端指向自己
service-url:
defaultZone: http://localhost:8888/eureka
把其他项目注册到 eureka
其他项目导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
各自修改yml
spring:
application:
name: xxxservice # 项目名
eureka:
client:
# 跟上面一样,需要指向Eureka服务端地址,这样才能进行注册
service-url:
defaultZone: http://localhost:8888/eureka
+++
在借阅项目
的controller借阅功能需要显示借阅人和借阅书籍, 对其他微服务实现远程调用
没有eureka时需要打上网址, 高度耦合
User user = template.getForObject("http://localhost:8082/user/"+uid, User.class);
现在只要打上项目名即可
@Service
public class BorrowServiceImpl implements BorrowService {
@Resource
BorrowMapper mapper;
@Resource
RestTemplate template;
@Override
public UserBorrowDetail getUserBorrowDetailByUid(int uid) {
List<Borrow> borrow = mapper.getBorrowsByUid(uid);
//这里不用再写IP,直接写服务名称userservice
User user = template.getForObject("http://userservice/user/"+uid, User.class);
//这里不用再写IP,直接写服务名称bookservice
List<Book> bookList = borrow
.stream()
.map(b -> template.getForObject("http://bookservice/book/"+b.getBid(), Book.class))
.collect(Collectors.toList());
return new UserBorrowDetail(user, bookList);
}
}
配置类导入一下bean
@Configuration
public class BeanConfig {
@Bean
@LoadBalanced
RestTemplate template(){
return new RestTemplate();
}
}
负载均衡
同一个服务器实际上是可以注册很多个的,但是它们的端口不同
[外链图片转存中…(img-zBnNx08j-1685195320267)]
Eureka中,同一个服务出现了两个实例
这两个用户服务任何一个假如挂了,另一个依然可以使用
高可用
创建eureka集群, eureka服务器挂了一个, 另外的依然可以使用
eureka 创建两个yml配置
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://eureka01:8801/eureka
server:
port: 8802
spring:
application:
name: eurekaserver
eureka:
instance:
hostname: eureka02
client:
fetch-registry: false
service-url:
defaultZone: http://eureka01:8801/eureka
使用 switchhosts 创建 hosts
127.0.0.1 eureka01
127.0.0.1 eureka02
每个微服务项目yml修改一遍
eureka:
client:
service-url:
# 将两个Eureka的地址都加入,这样就算有一个Eureka挂掉,也能完成注册
defaultZone: http://localhost:8801/eureka, http://localhost:8802/eureka
两个yml添加启动配置
注册两个eureka服务器
这两个eureka服务器关闭一个, 依然可以运行
ltZone: http://localhost:8801/eureka, http://localhost:8802/eureka
两个yml添加启动配置
[外链图片转存中...(img-551E4Zzl-1685195320270)]
注册两个eureka服务器
[外链图片转存中...(img-wDXiTa70-1685195320271)]
这两个eureka服务器关闭一个, 依然可以运行
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。