@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id) {
return userService.queryById(id);
}
public User queryById(Long id) {
return userMapper.findById(id);
}
首先,现在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注册中心
作用:
- 拉去服务(user-service),根据服务名称向eureka拉取提供者信息
- 负载均衡(相同的服务选择哪一个?),从服务列表中挑选一个
- 远程调用
- 服务提供者每30s会向Eureka发送一次心跳续约,以便Eureka知道服务提供者的健康状况,心跳不正常者会被剔除
Eureka包含两个组件:Eureka Server和Eureka Client。
Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
Eureka Client是一个客户端,用于简化与Eureka Server的交互,客户端同时也就是一个内置的、使用轮询(round-robin)负载算法的。
1、Eureka注册中心实现步骤
(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
2、运行
public Order queryOrderById(Long orderId) {
// 1.查询订单
### 笔者福利
##### 以下是小编自己针对马上即将到来的金九银十准备的一套“面试宝典”,不管是技术还是HR的问题都有针对性的回答。
**有了这个,面试踩雷?不存在的!**
##### 回馈粉丝,诚意满满!!!




-----------------------------------------------------------
修改order-service中的url地址,不需要将端口号写死了,只需要写服务名称即可
public Order queryOrderById(Long orderId) {
// 1.查询订单
笔者福利
以下是小编自己针对马上即将到来的金九银十准备的一套“面试宝典”,不管是技术还是HR的问题都有针对性的回答。
有了这个,面试踩雷?不存在的!
回馈粉丝,诚意满满!!!
[外链图片转存中…(img-LYobmhk8-1714699714678)]
[外链图片转存中…(img-WfrGF0kp-1714699714679)]
[外链图片转存中…(img-082biyte-1714699714679)]
[外链图片转存中…(img-kvnmKQzP-1714699714679)]
本文已被收录