springcloud提供的负载均衡之中,有通过feign和ribbon两种方案实现,这里介绍feign的实现方式,feign作为一种负载均衡方案,同时也是一个远程服务调用的服务提供方,feign是一种声明式服务调用,调用方只需要通过一个注解@FeignClient就可以调用feign提供的服务。
这里介绍前面springcloud入门实例中的feign项目,feign需要读取config项目中的配置文件,因此需要作为一个config-client,需要加入依赖spring-cloud-config-client,另外在整个springcloud中,他作为一个eureka client的角色,因此还需要配置spring-cloud-starter-netflix-eureka-client依赖,这个模块,我们提供的功能是保存用户,将前端通过RequestBody提交上来的name作为User的name保存到postgresql数据库中,因此我们需要postgresql依赖以及springboot的jpa依赖。
org.springframework.cloud
spring-cloud-starter
org.springframework.cloud
spring-cloud-config-client
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.boot
spring-boot-starter-data-jpa
2.0.4.RELEASE
org.postgresql
postgresql
runtime
除了启动类需要做一些特殊的设置之外,整个项目可以当做一个springboot项目来做,项目因为要涉及到操作数据库,所以稍微麻烦一些,只有整体来看这个springcloud项目,才能感受到整个项目有意思的地方很多。
准备User实体类,并指定表名,指定主键。
package com.xxx.feign.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;
@Entity
@Table(name = "xx_user")
public class User {
@Id
@GeneratedValue
private Integer id;
private String name;
private String mobile;
private Date birth;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public User(){}
public User(String name){
this.name = name;
this.mobile = "13800138000";
this.birth = new Date();
}
}
操作数据库接口UserDao.java,直接继承JpaRepository:
package com.xxx.feign.dao;
import com.xxx.feign.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserDao extends JpaRepository {
}
业务层类UserService.java,保存用户,并查询出用户列表的前10个用户。
package com.xxx.feign.service;
import com.xxx.feign.dao.UserDao;
import com.xxx.feign.domain.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
@Autowired
private UserDao userDao;
public List save(String name){
User user = new User(name);
userDao.save(user);
List list = userDao.findAll(PageRequest.of(0,10)).getContent();
return list;
}
}
控制层类UserController.java,处理保存用户方法入口。
package com.xxx.feign.web;
import com.xxx.feign.domain.User;
import com.xxx.feign.service.UserService;
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.RestController;
import java.util.List;
@RestController
public class UserController {
@Autowired
public UserService userService;
@PostMapping("/save")
public List save(@RequestBody String name){
return userService.save(name);
}
}
以上这些,都是在springboot或者springmvc中经常写的东西,没有任何springcloud的痕迹和侵蚀。我们在准备一个启动类FeignApplication.java。
package com.xxx.feign;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class FeignApplication {
public static void main(String[] args) {
SpringApplication.run(FeignApplication.class,args);
}
}
@EnableEurekaClient表示开启eureka client支持,注册到eureka server上。
项目中还需要一些配置文件:
application.yml
server:
port: 8082
spring:
jpa:
hibernate:
ddl-auto: update
dialect: org.hibernate.dialect.PostgreSQL9Dialect
properties:
hibernate:
temp:
use_jdbc_metadata_defaults: false
bootstrap.yml
spring:
application:
name: feign
cloud:
config:
enabled: true
discovery:
enabled: true
service-id: CONFIG
eureka:
instance:
non-secure-port: ${server.port:8082}
client:
service-url:
defaultZone: http://localhost:8761/eureka/
这里面没有我们连接postgresql数据库的连接信息,这里我们使用前面的配置服务来提供,这里再次贴出来这些配置,我们需要注意的是,这些配置不用再在本项目中配置:
feign.yml
spring:
jpa:
database: POSTGRESQL
datasource:
driver-class-name: org.postgresql.Driver
username: postgres
password:
url: jdbc:postgresql://localhost:5432/mydb
platform: postgres
启动这个项目,我们可以看到发现服务管理页面多了一个feign的服务。
现在我们还没有集成整个项目,但是我们可以通过简单的测试,保存用户功能:
插入之前数据库表中清理干净,没有记录。
通过curl模拟post请求,保存两个用户,接口返回成功。
再次查看数据库表,发现出现了两条记录。
这个feign项目在这里看不到负载均衡以及远程调用服务,他现在只是作为一个服务注册在了eureka server上。单独访问也没有问题,后面我们会在gateway项目中调用这个远程服务。
如果这里跟不上节奏,可以看看前面的内容:springcloud入门之服务发现和springcloud入门之配置服务。
项目源代码:https://github.com/buejee/springcloud