微服务两种方式登录

目录

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

最后效果一致。

相关推荐
亚空间仓鼠11 分钟前
Docker容器化高可用架构部署方案(十四)
docker·容器·架构
平行云35 分钟前
实时云渲染平台数据通道,支持3D应用文件上传下载分享无缝交互
linux·unity·云原生·ue5·gpu算力·实时云渲染·像素流送
2601_957786771 小时前
多平台矩阵系统的反脆弱架构:如何用技术解耦对抗平台规则的不确定性
人工智能·矩阵·架构·平台解耦
虎冯河1 小时前
Nano Banana Pro生图逻辑详解—— 从底层架构到实践指南
架构·aigc
姚不倒1 小时前
Go 进阶实战:实现泛型数据验证器
云原生·golang
万里侯1 小时前
Ansible自动化运维实战:从入门到生产级应用
微服务·容器·k8s
啷里格啷2 小时前
第三章 Fast-DDS核心源码导读与流程拆解-Discovery机制
后端·架构
什么半岛铁盒2 小时前
LangChain 入门与架构:快速搭建你的第一个 AI 应用
人工智能·架构·langchain
mirror_zAI2 小时前
C++ 仿 QQ 聊天室项目:Qt 客户端 + epoll 服务端 + Reactor 架构(含源码)
c++·qt·架构
啷里格啷2 小时前
第三章 Fast-DDS核心源码导读与流程拆解
后端·架构