把一个完整项目拆成多个微服务项目,不同微服务之间独立开发,部署
springboot项目结构图
[外链图片转存中…(img-BeBI7jTt-1685195320263)]
springcloud项目结构图
实体类实现在不同项目中公用,放在mycommons项目中,在其他项目导入mycommons依赖来使用它
<dependency>
<groupId>com.examplegroupId>
<artifactId>mycommonsartifactId>
<version>0.0.1-SNAPSHOTversion>
dependency>
[译:找到了] 一个集中管理微服务的平台, 自动注册并发现微服务
创建myeureka 项目
父项目添加依赖
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>2021.0.1version>
<type>pomtype>
<scope>importscope>
dependency>
myeureka项目添加依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
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.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
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服务器关闭一个, 依然可以运行