目录
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消费者
<!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>
@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。
依赖
<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为例
server:port: 8003
eureka:client:service-url:defaultZone: http://localhost:7000/eureka/
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/my_sql_3username: rootpassword: rootapplication:name: PROVIDER
mybatis:mapper-locations: classpath:/mapper/*.xmlconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpltype-aliases-package: org.example.entity
控制层
@RestController
public class MyController {@AutowiredMyUserService myUserService;@RequestMapping("/loginProvider")public String loginProvider(@RequestBody User user) {User user1 = myUserService.getUser(user);if(user1!=null){return "登录成功,欢迎";}else {return "登录失败,暂无该用户,请注册";}}
访问层
@Mapper
public interface MyUserDao {public userEntity getUser(userEntity user);
}
实体类
@Data
public class userEntity {public int id;public String username;public String password;
}
实现类
@Service
public class MyUserServiceImpl implements MyUserService {@AutowiredMyUserDao myUserDao;@Overridepublic userEntity getUser(userEntity user) {return myUserDao.getUser(user);}
}
mapper
<mapper namespace="org.example.dao.MyUserDao"><select id="getUser" resultType="User">select *from my_userwhere 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属性会作为微服务的名称,用于服务发现。
@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生产者
@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;}
最后效果一致。