微服务两种方式登录

目录

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;
    }

最后效果一致。

相关推荐
探索云原生5 分钟前
KServe 工作流程:从 InferenceService 到 vLLM 服务
docker·ai·云原生·kubernetes·go
用户30587595493116 分钟前
单体、微服务、集群、高可用:把软件架构听明白
架构
Ikalus198831 分钟前
四枚 JWT 全部验签通过,两个被算成了同一个人——错在 sub 少了 iss
安全·架构
小龙报1 小时前
【零到全栈】从扩展名到终端实操,打通 Linux 基础
linux·ubuntu·云原生·职场和发展·创业创新·学习方法·程序员创富
智驭未来掌门人1 小时前
架构师笔记:问卷调查的重要性
架构
对象存储与RustFS1 小时前
用 warp 压测 S3 兼容存储,十分钟跑出一份可复现的基准报告
后端·云原生·性能优化
吴佳浩 Alben1 小时前
一文讲透推理引擎性能指标:TTFT、TPOT、KV命中率、并发,到底对应 vLLM / SGLang 的哪个参数?
人工智能·python·语言模型·架构·ai编程·vllm·sglang
ting94520001 小时前
Kilo Code for JetBrains 深度技术剖析:原生开源编程智能体内部实现与工程实践
人工智能·架构·开源
做运维的阿瑞2 小时前
Terraform 的 Provider 与 Resource
云原生·云计算·terraform
淡海水2 小时前
03-02-架构篇-Boehm GC架构解析
unity·架构·c#·gc·boehm