Spring Cloud入门-Ribbon服务消费者(Hoxton版本)

本文详细解读了一线大厂Java面试题,介绍了如何在SpringBoot项目中使用Ribbon实现服务间负载均衡,以及通过RESTfulAPI进行CRUD操作的示例。还提供了实战项目源码和学习资源链接。
摘要由CSDN通过智能技术生成

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

if (entity.getStatusCode().is2xxSuccessful()) {

return entity.getBody();

} else {

return new Result(“操作失败”, 500);

}

}

POST请求方法

T postForObject(String url, @Nullable Object request, Class responseType, Object… uriVariables);

T postForObject(String url, @Nullable Object request, Class responseType, Map<String, ?> uriVariables);

T postForObject(URI url, @Nullable Object request, Class responseType);

ResponseEntity postForEntity(String url, @Nullable Object request, Class responseType, Object… uriVariables);

ResponseEntity postForEntity(String url, @Nullable Object request, Class responseType, Map<String, ?> uriVariables);

ResponseEntity postForEntity(URI url, @Nullable Object request, Class responseType);

postForObject示例

@PostMapping(“/insert”)

public Result insert(@RequestBody User user) {

return restTemplate.postForObject(userServiceUrl + “/user/insert”, user, Result.class);

}

postForEntity示例

@PostMapping(“/insert”)

public Result insert(@RequestBody User user) {

return restTemplate.postForEntity(userServiceUrl + “/user/insert”, user, Result.class).getBody();

}

PUT请求方法

void put(String url, @Nullable Object request, Object… uriVariables);

void put(String url, @Nullable Object request, Map<String, ?> uriVariables);

void put(URI url, @Nullable Object request);

PUT请求示例

@PutMapping(“/update”)

public Result update(@RequestBody User user) {

restTemplate.put(userServiceUrl + “/user/update”, user);

return new Result(“操作成功”,200);

}

DELETE请求方法

void delete(String url, Object… uriVariables);

void delete(String url, Map<String, ?> uriVariables);

void delete(URI url);

DELETE请求示例

@DeleteMapping(“/delete/{id}”)

public Result delete(@PathVariable Long id) {

restTemplate.delete(userServiceUrl + “/user/delete/{1}”, null, id);

return new Result(“操作成功”,200);

}

创建一个user-service模块


首先我们创建一个user-service,用于给Ribbon提供服务调用。

在pom.xml中添加相关依赖

org.springframework.cloud

spring-cloud-starter-netflix-eureka-client

org.springframework.boot

spring-boot-starter-web

在application.yml进行配置

主要是配置了端口和注册中心地址。

server:

port: 8201

spring:

application:

name: user-service

eureka:

client:

register-with-eureka: true

fetch-registry: true

service-url:

defaultZone: http://localhost:8001/eureka/

创建用户类User和统一返回前端的响应类Result

用户类User

public class User {

private Long id;

private String username;

private String password;

public User() {

}

public User(Long id, String username, String password) {

this.id = id;

this.username = username;

this.password = password;

}

// 省略setter和getter方法

}

统一返回前端的响应类Result

public class Result {

private T data;

private String message;

private int code;

public Result() {

}

public Result(T data, String message, int code) {

this.data = data;

this.message = message;

this.code = code;

}

public Result(String message, Integer code) {

this(null, message, code);

}

public Result(T data) {

this(data, “操作成功”, 200);

}

// 省略setter和getter方法

}

添加UserController用于提供调用接口

UserController类定义了对User对象常见的CRUD接口。

@RestController

@RequestMapping(“/user”)

public class UserController {

private static final Logger LOGGER = LoggerFactory.getLogger(UserController.class);

@Autowired

private UserService userService;

@PostMapping(“/insert”)

public Result insert(@RequestBody User user) {

userService.insert(user);

return new Result(“操作成功”, 200);

}

@GetMapping(“/{id}”)

public Result getUser(@PathVariable Long id) {

User user = userService.getUser(id);

LOGGER.info(“根据id获取用户信息,用户名称为:{}”,user.getUsername());

return new Result(user);

}

@GetMapping(“/listUsersByIds”)

public Result<List> listUsersByIds(@RequestParam List ids) {

List userList= userService.listUsersByIds(ids);

LOGGER.info(“根据ids获取用户信息,用户列表为:{}”,userList);

return new Result<List>(userList);

}

@GetMapping(“/getByUsername”)

public Result getByUsername(@RequestParam String username) {

User user = userService.getByUsername(username);

return new Result(user);

}

@PostMapping(“/update”)

public Result update(@RequestBody User user) {

userService.update(user);

return new Result(“操作成功”, 200);

}

@PostMapping(“/delete/{id}”)

public Result delete(@PathVariable Long id) {

userService.delete(id);

return new Result(“操作成功”, 200);

}

}

创建一个ribbon-service模块


这里我们创建一个ribbon-service模块来调用user-service模块演示负载均衡的服务调用。

在pom.xml中添加相关依赖

org.springframework.boot

spring-boot-starter-web

org.springframework.cloud

spring-cloud-starter-netflix-eureka-client

org.springframework.cloud

spring-cloud-starter-netflix-ribbon

在application.yml进行配置

主要是配置了端口、注册中心地址及user-service的调用路径。

server:

port: 8301

spring:

application:

name: ribbon-service

eureka:

client:

register-with-eureka: true

fetch-registry: true

service-url:

defaultZone: http://localhost:8001/eureka/

service-url:

user-service: http://user-service

使用@LoadBalanced注解赋予RestTemplate负载均衡的能力

可以看出使用Ribbon的负载均衡功能非常简单,和直接使用RestTemplate没什么两样,只需给RestTemplate添加一个@LoadBalanced即可。

@Configuration

public class RibbonConfig {

@Bean

@LoadBalanced

public RestTemplate restTemplate() {

return new RestTemplate();

}

}

添加UserRibbonController类

注入RestTemplate,使用其调用user-service中提供的相关接口,这里对GET和POST调用进行了演示,其他方法调用均可参考。

@RestController

@RequestMapping(“/user”)

public class UserRibbonController {

@Autowired

private RestTemplate restTemplate;

@Value(“${service-url.user-service}”)

private String userServiceUrl;

@GetMapping(“/{id}”)

public Result getUser(@PathVariable Long id) {

return restTemplate.getForObject(userServiceUrl + “/user/{1}”, Result.class, id);

}

@GetMapping(“/getByUsername”)

public Result getByUsername(@RequestParam String username) {

return restTemplate.getForObject(userServiceUrl + “/user/getByUsername?username={1}”, Result.class, username);

}

@GetMapping(“/getEntityByUsername”)

public Result getEntityByUsername(@RequestParam String username) {

ResponseEntity entity = restTemplate.getForEntity(userServiceUrl + “/user/getByUsername?username={1}”, Result.class, username);

if (entity.getStatusCode().is2xxSuccessful()) {

return entity.getBody();

} else {

return new Result(“操作失败”, 500);

}

}

@PostMapping(“/insert”)

public Result insert(@RequestBody User user) {

return restTemplate.postForObject(userServiceUrl + “/user/insert”, user, Result.class);

}

@PostMapping(“/update”)

public Result update(@RequestBody User user) {

return restTemplate.postForObject(userServiceUrl + “/user/update”, user, Result.class);

}

@PostMapping(“/delete/{id}”)

public Result delete(@PathVariable Long id) {

return restTemplate.postForObject(userServiceUrl + “/user/delete/{1}”, null, Result.class, id);

}

}

负载均衡功能演示


启动eureka-server于8001端口;

启动user-service于8201端口;

启动另一个user-service为8202端口,可以通过修改IDEA中的SpringBoot的启动配置实现:

在这里插入图片描述

此时运行中的服务如下:

在这里插入图片描述

调用接口进行测试:http://localhost:8301/user/1

读者福利

分享一份自己整理好的Java面试手册,还有一些面试题pdf

不要停下自己学习的脚步

字节跳动的面试分享,为了拿下这个offer鬼知道我经历了什么

字节跳动的面试分享,为了拿下这个offer鬼知道我经历了什么

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!
可以通过修改IDEA中的SpringBoot的启动配置实现:

在这里插入图片描述

此时运行中的服务如下:

在这里插入图片描述

调用接口进行测试:http://localhost:8301/user/1

读者福利

分享一份自己整理好的Java面试手册,还有一些面试题pdf

不要停下自己学习的脚步

[外链图片转存中…(img-6xXLFKVc-1714751191962)]

[外链图片转存中…(img-XYReVQhj-1714751191963)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

  • 13
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值