@TOC
1、先启动注册中心server
2、对项目进行拆分
提供者——service和dao
消费者——controller
2.1、公共组件common
2.2、搭建provider
依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>0225-demo</artifactId>
<groupId>com</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>provider-user</artifactId>
<dependencies>
<dependency>
<groupId>com</groupId>
<artifactId>common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- springboot核心 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- springboot web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.9</version>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!-- springboot mybaits整合 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
</dependencies>
</project>
搭建结构
启动类
由于这个项目还是springboot项目,所以还是需要controller类
UserProviderController.java
package com.controller;
import com.bean.dto.Dto;
import com.bean.pojo.User;
import com.service.RoleService;
import com.service.UserService;
import com.sun.org.apache.bcel.internal.generic.DUP;
import com.util.DtoUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class UserProviderController {
@Autowired
private UserService userService;
@Autowired
private RoleService roleService;
@PostMapping("/q/login")
public Dto queryforLogin(
@RequestParam String userName,
@RequestParam String password){
System.out.println(">>> 登录查询");
System.out.println("userName:" + userName);
System.out.println("password:" + password);
//查询
List<User> userList = userService.find(new User(userName, password));
//判断
if (userList.size() != 1)
return DtoUtil.error("用户名或密码错误!");
return DtoUtil.success("登录成功", userList.get(0));
}
@PostMapping("/q/login/2")
public Dto queryforLogin2(@RequestBody User user){
System.out.println(">>> 登录查询");
System.out.println(user);
//查询
List<User> userList = userService.find(user);
//判断
if (userList.size() != 1)
return DtoUtil.error("用户名或密码错误!");
return DtoUtil.success("登录成功", userList.get(0));
}
}
application.yml
server:
port: 8081
spring:
profiles: p1
---
server:
port: 8082
spring:
profiles: p2
---
spring:
application:
name: p-user
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/market?characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: 111111
druid:
driver-class-name: com.mysql.jdbc.Driver
eureka:
client:
service-url:
defaultZone: http://root:123456@server1:7776/eureka/,http://root:123456@server2:7777/eureka/
启动类
package com;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@MapperScan("com.dao")
@EnableDiscoveryClient
public class ProviderUserApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderUserApplication.class, args);
}
}
2.2、搭建consumer
依赖
添加feign组件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>0225-demo</artifactId>
<groupId>com</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>consumer-user</artifactId>
<dependencies>
<dependency>
<groupId>com</groupId>
<artifactId>common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- feign组件 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- springboot核心 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- springboot web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
application.yml
server:
port: 8181
spring:
profiles: c1
---
server:
port: 8182
spring:
profiles: c2
---
spring:
application:
name: c-user
eureka:
client:
service-url:
defaultZone: http://root:123456@server1:7776/eureka/,http://root:123456@server2:7777/eureka/
UserConsumerService.java
@FeignClient(name = “p-user”)
这是注册到注册中心的
package com.service;
import com.bean.dto.Dto;
import com.bean.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
/**
* 用户消费者业务逻辑接口
*/
@FeignClient(name = "p-user")
public interface UserConsumerService {
@PostMapping("/q/login")
public Dto queryforLogin(
@RequestParam String userName,
@RequestParam String password);
@PostMapping("/q/login/2")
public Dto queryforLogin2(@RequestBody User user);
}
UserController.java
package com.controller;
import com.bean.dto.Dto;
import com.bean.pojo.Role;
import com.bean.pojo.User;
import com.bean.vo.Query;
import com.service.UserConsumerService;
import com.util.DtoUtil;
import com.util.PageAssistant;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.List;
/**
* 用户业务控制器(展现层)
*/
@Controller
@RequestMapping("user")
public class UserController {
@Autowired
private UserConsumerService userConsumerService;
/**
* 修改
* @return
*/
@RequestMapping("modify")
public String modify(HttpSession session, User user){
System.out.println(">>> user modify");
System.out.println(user);
return "unique";
}
/**
* 查询单个用户
* @param session
* @param user
* @param page
* @return
*/
@RequestMapping("unique")
public String unique(HttpSession session, User user, String page){
System.out.println(">>> user unique");
System.out.println(user);
System.out.println(page);
//查询
//保存
if (page == null){
page = "detail";
}
return "redirect:/page/user/" + page + ".jsp";
}
/**
* 添加
* @return
*/
@RequestMapping("add")
public String save(HttpSession session, User user){
System.out.println(">>> user add");
System.out.println(user);
//添加
//跳转
return "/user/unique";
}
/**
* 查询
* @param session
* @return
*/
@RequestMapping("query")
@ResponseBody
public Dto query(HttpSession session, PageAssistant<User> paUser, Query query){
System.out.println(">>> user query");
System.out.println(query);
HashMap<String, Object> map = new HashMap<>();
map.put("key", query.getKeyword());
map.put("roleId", query.getRoleId());
//查询总记录数
map.put("start", paUser.getStart());
map.put("size", paUser.getPageSize());
//查询页面内容
//查询职务列表
return DtoUtil.success(paUser);
}
/**
* 登录
* @param user
* @return
*/
@RequestMapping("login")
@ResponseBody
public Dto login(User user){
System.out.println(">>> user login");
System.out.println(user);
//查询
// Dto dto = userConsumerService.queryforLogin(user.getUserName(), user.getPassword());
Dto dto = userConsumerService.queryforLogin2(user);
return dto;
// return DtoUtil.error("用户名或密码错误!");
}
}
启动类ConsumerUserApplication.java
package com;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ConsumerUserApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerUserApplication.class, args);
}
}
UserConsumerService.jiava和UserProviderController是有对应关系的,方法定义需要一模一样
先启动provider再启动consumer
调用步骤:
在consumer里调用service方法时,就会去service的接口里
然后在service接口里根据Feign组件的名称,到注册中心找到IP地址和端口
再去访问IP地址和端口的对应路径——再去访问provider对应的controller类对应的方法里执行,然后provider把结果给consumer
2.3、验证结果
postman
优点
响应速度,可用性(拆开后,可用性更高,provider和consumer承载的服务器是不一样的)
2.4/关于带参数
如果不加注解,否则无法拿到参数
3/Ribbon组件
- 只要使用了feign组件,就会默认加载Ribbon组件,如果没有使用feign组件,就要单独添加依赖
- ribbon不需要做任何配置和修改,ribbon的负载均衡策略默认是轮询,只要consumer对应的provider是两个或者以上的服务器。
Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。
如何更改负载均衡的配置
在consumer的配置文件
应用名: