赞
踩
@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": "广东湛江" } }
===============================================================================
上面服务拆分部分不难看出,在restTemplate调用的url中,url以及耦合死了,这明显也是不利于后期的维护
并且如果有多个相同的服务该如何选择调用?
我们又怎么知道每个服务的健康情况?
因此,这里就需要Eureka注册中心
作用:
- 注册服务信息,服务提供者启动时向eureka注册自己的信息
- 拉去服务(user-service),根据服务名称向eureka拉取提供者信息
- 负载均衡(相同的服务选择哪一个?),从服务列表中挑选一个
- 远程调用
- 服务提供者每30s会向Eureka发送一次心跳续约,以便Eureka知道服务提供者的健康状况,心跳不正常者会被剔除
Eureka包含两个组件:Eureka Server和Eureka Client。
Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就是一个内置的、使用轮询(round-robin)负载算法的负载均衡器。
(1)新建一个模块,导入eureka客户端依赖
<!--eureka客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
(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
可以看到注册的服务和其对应的接口地址
小知识:
如果想多开同一个服务,可以右键该服务,选择复制配置
然后更换里面的名称和端口号
-Dserver.port=8082
修改order-service中的url地址,不需要将端口号写死了,只需要写服务名称即可
public Order queryOrderById(Long orderId) { // 1.查询订单 ### 笔者福利 ##### 以下是小编自己针对马上即将到来的金九银十准备的一套“面试宝典”,不管是技术还是HR的问题都有针对性的回答。 **有了这个,面试踩雷?不存在的!** ##### 回馈粉丝,诚意满满!!! ![](https://img-blog.csdnimg.cn/img_convert/4b419492dfafd94121d4992b4333752a.webp?x-oss-process=image/format,png) ![](https://img-blog.csdnimg.cn/img_convert/7f219a5362b293adf8f13746e39450a0.webp?x-oss-process=image/format,png) ![](https://img-blog.csdnimg.cn/img_convert/4f60c727665d5c00769460590a065561.webp?x-oss-process=image/format,png) ![](https://img-blog.csdnimg.cn/img_convert/aea3a5e8cdd60dab8e1957d123db3c34.webp?x-oss-process=image/format,png) ----------------------------------------------------------- 修改order-service中的url地址,不需要将端口号写死了,只需要写服务名称即可
public Order queryOrderById(Long orderId) {
// 1.查询订单
有了这个,面试踩雷?不存在的!
[外链图片转存中…(img-LYobmhk8-1714699714678)]
[外链图片转存中…(img-WfrGF0kp-1714699714679)]
[外链图片转存中…(img-082biyte-1714699714679)]
[外链图片转存中…(img-kvnmKQzP-1714699714679)]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。