微服务两种方式登录

目录

1.restTemplate方式

1.1页面

1.2消费者

1.3生产者

1.4效果

2.Feign方式

2.1Service

2.2生产者

三个生产者 一个消费者,三个生产者需要用mysql+mybatis 三个不同的数据库。

页面输入用户名和密码,提交到后端消费者,消费者传到生产者后端在进行判断,返回登录成功或登录失败到消费者,消费者再放到页面上进行显示。

1.restTemplate方式

restTemplate.getForObject 向远程取数据 两个参数url和数据类型

restTemplate.postForObject 向远程服务传参数 三个参数url、参数、返回值类型

@RequestBody 跨域(端口不同)得到对象数据,必须是post提交

1.1页面

1.2消费者

html 复制代码
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
</head>
<body>
<form th:action="@{/loginEntity}" method="post">
    <span th:text="${result}"></span>
    <input type="username" th:placeholder="请输入用户名" name="username"/>
    <input type="password" placeholder="请输入密码" name="password" />
    <input type="submit" th:value="登录"/>
</form>

</body>
</html>
java 复制代码
@RequestMapping("/gotoLogin")
    public String gotoLogin() {
        return "login";
    }
    @RequestMapping("/loginEntity")
    public ModelAndView loginEntity(User user) {
        ModelAndView mav = new ModelAndView();
        String result = restTemplate.postForObject("http://PROVIDER/loginProvider", user, String.class);
        mav.addObject("result", result);
        mav.setViewName("login");
        return mav;
    }

1.3生产者

因为使用负载均衡,所以不知道第一次回去那个生产者,所以每个生产者都需要写loginProvider。

依赖

XML 复制代码
<dependency>         
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.example.entity</groupId>
            <artifactId>common</artifactId>
            <version>1.0-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>

配置文件

三个生产者每个生产者各使用一个数据库,所以这里以生产者3为例

java 复制代码
server:
  port: 8003
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7000/eureka/
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/my_sql_3
    username: root
    password: root
  application:
    name: PROVIDER
mybatis:
  mapper-locations: classpath:/mapper/*.xml
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  type-aliases-package: org.example.entity

控制层

java 复制代码
@RestController
public class MyController {
    @Autowired
    MyUserService myUserService;

    @RequestMapping("/loginProvider")
    public String loginProvider(@RequestBody User user) {
        User user1 = myUserService.getUser(user);
        if(user1!=null){
            return "登录成功,欢迎";
        }else {
            return "登录失败,暂无该用户,请注册";
        }
    }

访问层

java 复制代码
@Mapper
public interface MyUserDao {
  public userEntity getUser(userEntity user);
}

实体类

java 复制代码
@Data
public class userEntity {
    public int id;
    public String username;
    public String password;
}

实现类

java 复制代码
@Service
public class MyUserServiceImpl implements MyUserService {
    @Autowired
    MyUserDao myUserDao;
    @Override
    public userEntity getUser(userEntity user) {
        return myUserDao.getUser(user);
    }
}

mapper

java 复制代码
<mapper namespace="org.example.dao.MyUserDao">
    <select id="getUser" resultType="User">
        select *
        from my_user
        where username = #{username} and password=#{password}
    </select>
</mapper>

1.4效果

进入gotoLogin页面

登录失败

登录成功

2.Feign方式

Feign是Spring Cloud提供的声明式、模板化的HTTP生产者,它使得调用远程服务就像调用本地服务一样简单,只需要创建一个接口并添加一个注解即可。

Spring Cloud集成Feign并对其进行了增强,使Feign支持了Spring MVC注解;Feign默认集成了Ribbon,所以Fegin默认就实现了负载均衡的效果。Spring Cloud 常见的集成方式是使用Feign+Ribbon技术来完成服务间远程调用及负载均衡的。

前端传值

后端传值

2.1Service

@FeignClient的属性name:指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现。

java 复制代码
@Service
@FeignClient(name = "PROVIDER",fallbackFactory= MyFeignClientFallbackFactory.class)//name=客户端远程服务的名字,fallbackFactory一旦出现错误进入这个类中
public interface UserService {
 
    @RequestMapping("/loginProvider")
    public String loginProvider(User user);
 
    @RequestMapping("/getuser/{name}")
    public String getuser(@PathVariable("name") String name);
}

2.2生产者

java 复制代码
@RequestMapping("/loginEntity")
    public ModelAndView loginEntity(User user) {
        ModelAndView mav = new ModelAndView();
//        String result = restTemplate.postForObject("http://PROVIDER/loginProvider", user, String.class);
        String result = userService.loginProvider(user);
        mav.addObject("result", result);
        mav.setViewName("login");
        return mav;
    }

最后效果一致。

相关推荐
郑州光合科技余经理14 小时前
代驾系统架构拆解:订单链路、权限组织与私有化源码交付
开发语言·后端·算法·架构·系统架构·uni-app·php
冷莫溪17 小时前
Kubernetes——k8s v1.24离线部署(Containerd + Calico)
云原生·容器·kubernetes
条tiao条20 小时前
MVVM架构与ArkUI状态管理
华为·架构·harmonyos·鸿蒙·mvvm
崔亮的博客21 小时前
K8S GPU 调度——Operator 自动管理GPU
云原生·容器·kubernetes
sugar__salt1 天前
Spring 三层架构与 IoC、依赖注入完全指南
java·spring boot·后端·spring·架构·maven·intellij-idea
歪歪歪比巴卜1 天前
服务商批量接手客户跨平台社媒账号的技术落地:体检体系与重启架构
矩阵·架构·aigc
BerryS3N1 天前
2026年AI前沿技术全景深度解析:大模型推理范式变革、Agentic AI工程架构与底层基础设施演进
人工智能·架构
神王宝宝 王者小学1 天前
面向领域驱动架构的查询实现方式
前端·python·架构
计算机魔术师1 天前
传统基础架构 - 微服务
大数据·后端·微服务·架构·开发工具·编程语言
晨米酱1 天前
Matt Pocock Skills v1.2:控制从主流程深入到每一步
面试·架构·agent