}
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2.返回
return order;
}
user-service前端控制器:根据id查询用户信息
@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id) {
return userService.queryById(id);
}
public User queryById(Long id) {
return userMapper.findById(id);
}
> 思路:**要想查询订单的信息返回的数据需要有用户信息,那只需要在service层查询出订单信息之后,再利用订单信息中的用户id,像Axios那样访问user-service层的接口,根据id获取到用户信息,接着返回一个User实体类,订单利用set方法给成员变量中的User赋值即可**
首先,现在order-service模块将RestTemplate注入到spring容器中
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
/**
* 完成RestTemplate并注入到spring容器中
* @return
*/
//负载均衡
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
接着在service层访问user-service层的接口
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
//2.利用RestTemplate查询用户
String url = "http://loaclhost:8081/user/"+order.getUserId();
//restTemplate传递一个User.clss过去目的是为了返回不是一个json,而是返回一个实体类
User user = restTemplate.getForObject(url, User.class);
//3.封装user信息
order.setUser(user);
// 4.返回
return order;
}
接下来同时运行两个服务,在浏览器上请求order-service的接口,就可以得到一条json数据
{
“id”: 101,
“price”: 699900,
“name”: "Apple 苹果 iPhone 12 ",
“num”: 1,
“userId”: 1,
“user”: {
"id": 1,
"username": "张三",
"address": "广东湛江"
}
}
* * *
[]( )三、Eureka注册中心
===============================================================================
> 上面服务拆分部分不难看出,在restTemplate调用的url中,url以及耦合死了,这明显也是不利于后期的维护
>
> 并且如果有多个相同的服务该如何选择调用?
>
> 我们又怎么知道每个服务的健康情况?
>
> 因此,这里就需要**Eureka**注册中心
>
> 作用:
>
> 1. 注册服务信息,服务提供者启动时向eureka注册自己的信息
> 2. 拉去服务(user-service),根据服务名称向eureka拉取提供者信息
> 3. 负载均衡(相同的服务选择哪一个?),从服务列表中挑选一个
> 4. 远程调用
> 5. 服务提供者每30s会向Eureka发送一次心跳续约,以便Eureka知道服务提供者的健康状况,心跳不正常者会被剔除
![在这里插入图片描述](https://img-blog.csdnimg.cn/c413b509f38a48e2b55a7d856d9e9bee.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbW3lpKnlpKnlhplidWc=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
> Eureka包含两个组件:Eureka Server和Eureka Client。
>
> Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
>
> Eureka Client是一个[java]( )客户端,用于简化与Eureka Server的交互,客户端同时也就是一个内置的、使用轮询(round-robin)负载算法的[负载均衡器]( )。
* * *
[]( )1、Eureka注册中心实现步骤
-----------------------------------------------------------------------------------
(1)新建一个模块,导入eureka客户端依赖
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
(2)配置Eureka相关信息
spring:
application:
name: eurkaserber #服务名称
eureka:
client:
service-url: #eureka地址信息
defaultZone: http://127.0.0.1:10086/eureka
(3)打开Eureka自动装配开关
//eureka自动装配开关
@EnableEurekaServer
@SpringBootApplication
public class EurekaAplication {
public static void main(String[] args) {
SpringApplication.run(EurekaAplication.class, args);
}
}
(4)注册服务
* 先在要注册的服务中引入依赖
```
<!--eureka客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
```
* 在要注册的服务填写有关Ereka配置信息
```
spring:
application:
name: userservice #userservice的服务名称
eureka:
client:
service-url: #eureka地址信息
defaultZone: http://127.0.0.1:10086/eureka
```
* 在order-service中添加负载均衡注解
```
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
/**
* 完成RestTemplate并注入到spring容器中
* @return
*/
//负载均衡
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
```
* order-service同上操作,只是服务名称改变
> **注意的是,千万不要端口号重复了,我这里Eureka的端口号是10086**
>
> 操作到这里,就可以了,服务以及成功在Ereka中注册了,这时候将三个服务跑起来
>
> 用浏览器进入localhost:10086
![在这里插入图片描述](https://img-blog.csdnimg.cn/553357a69f49419bbc41ecb44ee80911.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbW3lpKnlpKnlhplidWc=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
可以看到注册的服务和其对应的接口地址
> 小知识:
>
> 如果想多开同一个服务,可以右键该服务,选择复制配置
>
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/e3a3c0b6c8b243d2a974c3b285e1f153.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbW3lpKnlpKnlhplidWc=,size_15,color_FFFFFF,t_70,g_se,x_16#pic_center)
> 然后更换里面的名称和端口号
>
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/abaec0e46f574c628dac3970794d4b4c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbW3lpKnlpKnlhplidWc=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
# 写在最后
学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!
最后再分享的一些BATJ等大厂20、21年的面试题,把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。
![蚂蚁金服三面直击面试官的Redis三连,Redis面试复习大纲在手,不慌](https://img-blog.csdnimg.cn/img_convert/52f731fc4f308f4213109315a0600e58.webp?x-oss-process=image/format,png)
Mybatis面试专题
![蚂蚁金服三面直击面试官的Redis三连,Redis面试复习大纲在手,不慌](https://img-blog.csdnimg.cn/img_convert/79f2b202076ef2d5009a14b536d10412.webp?x-oss-process=image/format,png)
MySQL面试专题
![蚂蚁金服三面直击面试官的Redis三连,Redis面试复习大纲在手,不慌](https://img-blog.csdnimg.cn/img_convert/c55e88867e42c380cc2c6e3f65bb4689.webp?x-oss-process=image/format,png)
并发编程面试专题
s-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbW3lpKnlpKnlhplidWc=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
# 写在最后
学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!
最后再分享的一些BATJ等大厂20、21年的面试题,把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。
[外链图片转存中...(img-sco9XZGc-1714699738518)]
Mybatis面试专题
[外链图片转存中...(img-zYu2UGVK-1714699738518)]
MySQL面试专题
[外链图片转存中...(img-Ibn0Q8nv-1714699738519)]
并发编程面试专题
> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/topics/618154847)收录**