为了账号安全,请及时绑定邮箱和手机立即绑定

Spring Boot 中的微服务是如何通信的?

外部服务通讯

可以看看我视频中的详细解释

在这个教程里,我们将深入探讨微服务的世界,看看如何利用Spring Boot的RestTemplate来实现它们之间的通信。

你将学会在Spring Boot中设置微服务的基础,并配置RestTemplate进行服务间的RESTful API调用。通过这段视频,你将对服务之间的通信有一个扎实的理解,并在自己的项目中轻松实现它。非常适合想要掌握Spring Boot微服务架构的开发者。

我已经为此设置了两个服务

  1. 课程服务
  2. 学生服务

或:

  1. 课程功能
  2. 学生功能

(使用顿号更清晰: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)

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消