可以看看我视频中的详细解释
在这个教程里,我们将深入探讨微服务的世界,看看如何利用Spring Boot的RestTemplate来实现它们之间的通信。
你将学会在Spring Boot中设置微服务的基础,并配置RestTemplate进行服务间的RESTful API调用。通过这段视频,你将对服务之间的通信有一个扎实的理解,并在自己的项目中轻松实现它。非常适合想要掌握Spring Boot微服务架构的开发者。
我已经为此设置了两个服务
- 课程服务
- 学生服务
或:
- 课程功能
- 学生功能
(使用顿号更清晰:1. 课程服务、2. 学生服务)
通过此API,课程服务将与学生服务进行交流。
http://localhost:9898/courses/students (学生课程页面)
http://localhost:9090/students
这里还有其他的API,你可以试一试。
Course.java
包 com.ajtech.cource.entity;
导入 jakarta.persistence.*;
导入 lombok.*;
@Data
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "course")
public class Course {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String courseName;
private Double courseFee;
}
Student.java (一个Java文件)
包 com.ajtech.cource.entity;
import jakarta.persistence.*;
import lombok.*;
@Data
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name="student")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String course;
}
CourseRepository.java
包 com.ajtech.cource.repo;
导入 com.ajtech.cource.entity.Course;
导入 org.springframework.data.jpa.repository.JpaRepository;
导入 org.springframework.stereotype.Repository;
@Repository
公共接口 CourseRepository 继承 JpaRepository<Course, Long> {
CourseService.java
包 com.ajtech.cource.service;
导入 com.ajtech.cource.entity.*;
导入 com.ajtech.cource.entity.*;
导入 com.ajtech.cource.repo.CourseRepository;
导入 lombok.extern.slf4j.Slf4j;
导入 org.springframework.beans.factory.annotation.Autowired;
导入 org.springframework.stereotype.Service;
导入 org.springframework.web.client.RestTemplate;
导入 java.util.Arrays;
导入 java.util.List;
@Slf4j
@Service
public 类 CourseService {
@Autowired
private RestTemplate restTemplate;
@Autowired
private CourseRepository courseRepository;
public 列表<Course> 获取所有课程() {
日志.信息("获取所有课程() 开始");
返回 courseRepository.findAll();
}
public Course 获取课程ById(Long id) {
日志.信息("获取课程ById() 开始");
返回 courseRepository.findById(id).orElse(null);
}
public Course 保存课程(Course course) {
日志.信息("保存课程() 开始");
返回 courseRepository.save(course);
}
public void 删除课程ById(Long id) {
日志.信息("删除课程ById() 开始");
courseRepository.deleteById(id);
}
public 列表<Student> 获取所有学生FromStudentService() {
日志.信息("从StudentService获取所有学生() 开始");
字符串 url = "http://localhost:9090/students";
Student[] students = restTemplate.getForObject(url, Student[].class);
日志.信息("学生:" + students);
返回 Arrays.asList(students);
}
}
这是一个Java文件名:CourseController.java,其中"CourseController"可以解释为"课程控制器"。
包 com.ajtech.cource.controller;
导入 com.ajtech.cource.entity.Course;
导入 com.ajtech.cource.entity.Student;
导入 com.ajtech.cource.service.CourseService;
导入 lombok.extern.slf4j.Slf4j;
导入 org.springframework.beans.factory.annotation.Autowired;
导入 org.springframework.web.bind.annotation.*;
导入 java.util.List;
@Slf4j
@RestController
@RequestMapping("/courses")
public class CourseController {
@Autowired
private CourseService courseService;
@GetMapping
public List<Course> getAllCourses() {
log.info("获取所有课程开始");
return courseService.getAllCourses();
}
@GetMapping("/{id}")
public Course getCourseById(@PathVariable Long id) {
log.info("根据ID获取课程开始");
return courseService.getCourseById(id);
}
@PostMapping
public Course createCourse(@RequestBody Course course) {
log.info("创建课程开始");
return courseService.saveCourse(course);
}
@PutMapping("/{id}")
public Course updateCourse(@PathVariable Long id, @RequestBody Course course) {
log.info("更新课程开始");
Course existingCourse = courseService.getCourseById(id);
if (existingCourse != null) {
existingCourse.setCourseName(course.getCourseName());
existingCourse.setCourseFee(course.getCourseFee());
return courseService.saveCourse(existingCourse);
}
return null;
}
@DeleteMapping("/{id}")
public void deleteCourse(@PathVariable Long id) {
log.info("删除课程开始");
courseService.deleteCourse(id);
}
@GetMapping("/students")
public List<Student> getAllStudents() {
return courseService.getAllStudentsFromStudentService();
}
}
数据库属性
spring.application.name=应用
server.port=9898
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
#spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
学生服务中心
Student.java
包 com.ajtech.student.entity;
导入 jakarta.persistence.*;
导入 lombok.*;
@Data
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name="student")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String course;
}
StudentRepository.java(注:在中文语境中,此类文件名通常保持不变)
package com.ajtech.student.repo;
import com.ajtech.student.entity.Student;
import org.springframework.data.jpa.repository.JpaRepository;
public interface StudentRepository extends JpaRepository<Student, Long> {
}
StudentService.java
包 com.ajtech.student.service;
导入 com.ajtech.student.entity.Student;
导入 com.ajtech.student.repo.StudentRepository;
导入 org.springframework.beans.factory.annotation.Autowired;
导入 org.springframework.stereotype.Service;
导入 java.util.List;
@Service
公开 类 StudentService {
@Autowired
私有 学生仓库 studentRepository;
公有 列表<Student> 获取所有学生() {
返回 studentRepository.findAll();
}
公有 Student 获取学生ById(长整型 id) {
返回 studentRepository.findById(id).orElse(null);
}
公有 Student 保存学生(Student student) {
返回 studentRepository.save(student);
}
公有 无 删除学生(长整型 id) {
studentRepository.deleteById(id);
}
}
学生控制器Java文件 (xuéshēn kòngzhìqì Java wénjiàn)
包 com.ajtech.student.controller;
导入 com.ajtech.student.entity.Student;
导入 com.ajtech.student.service.StudentService;
导入 org.springframework.beans.factory.annotation.Autowired;
导入 org.springframework.web.bind.annotation.*;
导入 java.util.List;
@RestController
@RequestMapping("/students")
公共类 StudentController {
@Autowired
私有 StudentService 学生服务;
@GetMapping
公共 List<Student> getAllStudents() {
返回 学生服务.getAllStudents();
}
@GetMapping("/{id}")
公共 Student getStudentById(@PathVariable Long id) {
返回 学生服务.getStudentById(id);
}
@PostMapping
公共 Student createStudent(@RequestBody Student student) {
返回 学生服务.saveStudent(student);
}
@PutMapping("/{id}")
公共 Student updateStudent(@PathVariable Long id, @RequestBody Student student) {
Student existingStudent = 学生服务.getStudentById(id);
如果 (existingStudent != null) {
existingStudent.setName(student.getName());
existingStudent.setCourse(student.getCourse());
返回 学生服务.saveStudent(existingStudent);
}
返回 null;
}
@DeleteMapping("/{id}")
公共 void deleteStudent(@PathVariable Long id) {
学生服务.deleteStudent(id);
}
}
DB属性
spring.application.name=student # 应用程序名称为学生
server.port=9090 # 代码用于设置服务器监听端口为9090
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # 数据库驱动类名
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
#spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect # Hibernate方言设置为MySQL5Dialect (已注释)
你可以启动这两个服务后,并使用 Post Man 测试所有 API。
谢谢你,加油学习!
关注我,更多精彩内容等你来!
ajtech感谢您读到最后,临走之前,
- 👏为作者点赞并关注作者!
- 关注我们^1!
[点击这里在 Medium 上关注我](https://medium.com/@saijanand)