微服务与传统项目的不同之处: 1、微服务需要根据业务模块拆分,做到单一职责,不要重复开发相同业务
2、微服务可以将业务暴露为接口,供其它微服务使用
【微服务|Eureka快速入门,Eureka简介,什么是Eureka(Eureka注册中心配置)】3、不同微服务都应该有自己独立的数据库
每一个模块只做自己分内的事情,每一个数据库也只存自己份内拥有的数据。
需求分析 :
现在有两个服务分别是订单服务和用户信息服务,由于每个服务只能提供单一的功能,所以我们想查询一个订单,并且在该订单的查询结果中显示订单的详情之外也显示订单所属用户的基本信息,显然根据微服务设计原则,订单模块只能查出订单的信息,无法查询出用户的信息,所以 下文都是围绕该问题进行书写。
文章图片
一、微服务初体验: 下面采用最简单直接的方式实现上述的功能
1、将RestTemplate对象注入到Spring容器。(通常在配置类或启动类注入)
//在Spring Boot启动类注入
@SpringBootApplication
public class OrderApplication {public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
} //注入RestTemplate 对象
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
2、使用端调用get/postForObject来向不同的服务发送请求:
@Service
public class OrderService {@Autowired//注入对象
private RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// TODO 2.查询用户
String url = "http://localhost:8081/user/" +order.getUserId();
//当传入类名时会自动返回对应的数据类型
User user = restTemplate.getForObject(url, User.class);
// 3.封装user信息
order.setUser(user);
// 4.返回
return order;
}
}
二、Eureka注册中心服务: 1、Eureka原理讲解:
通过上面的操作我们会发现一些问题:
1、地址发生了硬编码。
2、如果为了负载均衡提供了多个端口,有些挂掉了,我们就会访问挂掉的服务造成堵塞
文章图片
于是Eureka为我们做了如下的操作:
1、消费者该如何获取服务提供者具体信息?
- 服务提供者启动时向eureka注册自己的信息
- eureka保存这些信息
- 消费者根据服务名称向eureka拉取提供者信息
- 服务消费者利用负载均衡算法,从服务列表中挑选一个
- 服务提供者会每隔30秒向EurekaServer发送心跳请求,报告健康状态
- eureka会更新记录服务列表信息,心跳不正常会被剔除
- 消费者就可以拉取到最新的信息
文章图片
文章图片
1、创建Maven项目引入server服务端依赖:
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
2、编写启动类,添加@EnableEurekaServer注解:
@SpringBootApplication
//就加一个eureka的注解即可
@EnableEurekaServer
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
3、添加application.yml文件,编写配置信息:
server:
port: 10086 # eureka的端口
spring:
application:
name: eurekaserver # eureka这个服务的名称
eureka:
client:
service-url: #eureka的地址信息
defaultZone: http://127.0.0.1:10086/eureka/
3、Eureka注册服务: 1、来到客户端,添加client客户端依赖:
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
2、来到客户端的yml文件,将其注册进去:
spring:
application:
name: userservice # 微服务的名称,这个名称后期互相调用时候会用
eureka:
client:
service-url: # eureka的地址信息
defaultZone: http://127.0.0.1:10086/eureka/
4、Eureka访问服务: 在前几个步骤我们已经实现了 注册Eireka服务器->注册服务 此时我们就开始关注如何实现服务之间的访问。
1、将之前的url修改为服务的地址:
@Autowired
private RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2.利用RestTemplate发起http请求,查询用户
// 2.1.url路径
String url = "http://userservice/user/" + order.getUserId();
// 2.2.发送http请求,实现远程调用
User user = restTemplate.getForObject(url, User.class);
// 3.封装user到Order
order.setUser(user);
// 4.返回
return order;
}
2、为了保证复杂均衡,在RestTemplate上添加复杂均衡@LoadBalanced注解:
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
推荐阅读
- 《Effective Java》第9条(try-with-resources优先于try-finally)
- python|victoriametrics的prometheus高可用性和容错策略长期存储
- 架构师之路-java|【Nacos】1.1 从单体架构到微服务
- java|HttpClient发送HTTP/HTTPS的GET/POST请求工具类(绕过证书验证)
- 牛客网|【Java刷题进阶】基础入门篇⑤
- java|关于微信小程序与Java后台交互数据中中文乱码问题的讨论
- 网易二面(Kafka为什么吞吐量大、速度快(?))
- JEECG低代码平台|JeecgBoot 3.4.0 版本发布,微服务重构版本
- 别再乱打日志了,这份 Java 日志规范,应有尽有,建议收藏!!