springcloud入门之通过feign实现负载均衡

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的服务。

springcloud入门之通过feign实现负载均衡_第1张图片

现在我们还没有集成整个项目,但是我们可以通过简单的测试,保存用户功能:

 插入之前数据库表中清理干净,没有记录。

springcloud入门之通过feign实现负载均衡_第2张图片

通过curl模拟post请求,保存两个用户,接口返回成功。

springcloud入门之通过feign实现负载均衡_第3张图片

再次查看数据库表,发现出现了两条记录。

 这个feign项目在这里看不到负载均衡以及远程调用服务,他现在只是作为一个服务注册在了eureka server上。单独访问也没有问题,后面我们会在gateway项目中调用这个远程服务。

 如果这里跟不上节奏,可以看看前面的内容:springcloud入门之服务发现和springcloud入门之配置服务。

项目源代码:https://github.com/buejee/springcloud

你可能感兴趣的:(java)