1. 程式人生 > >SpringCloud微服務大綱 02(idea篇)

SpringCloud微服務大綱 02(idea篇)

Ribbon 呼叫

負載均衡演算法

  • 輪循演算法

啟動兩個userService服務

  • 注意:當無法同時執行兩個main方法的時候,如下操作

點選進入第一個選項

在這裡插入圖片描述
右上角把這裡的√全部取消掉之後點apply執行
在這裡插入圖片描述
設定兩個不同的埠

server:
  port: 8881
server:
port: 8882

在這裡插入圖片描述

controller類中可以隨便新增一個方法測試

 @GetMapping("/a")
    public String a(){
        return "1";
    }
  • 執行userview服務
    在controller類中新增一個方法呼叫
 @Autowired
    RestTemplate rt;
    @GetMapping("/a")
    public String a(){
        String url="http://USERSERVICE/a";
        String forObject = rt.getForObject(url, String.class);
        return forObject;
    }
  • 實現以下情況 ,輪流迴圈1和2
    在這裡插入圖片描述
    在這裡插入圖片描述

  • 隨機演算法(RandomRule)

在userview的main方法的類中新增一個Bean
在這裡插入圖片描述


重新執行,即可去看效果

  • 在這裡也可以自己定義一個rule類,按照自己的規則去定義

  • 注意:建立一個在main方法子類或則同層級的類,否則無法掃描到,還有不要新增任何註解

在這裡插入圖片描述
需要extends AbstractLoadBalancerRule類,在實現重寫

public class MyRule extends AbstractLoadBalancerRule {
    @Override
    public void initWithNiwsConfig(IClientConfig iClientConfig) {

    }
    @Override
public Server choose(Object o) { ILoadBalancer loadBalancer = this.getLoadBalancer(); List<Server> reachableServers =loadBalancer.getReachableServers(); return reachableServers.get(0); } }

簡單的實現了永遠執行第一臺服務service;快去試試自己 的規則吧!在這裡插入圖片描述

  • 注意:這樣定義的規則是針對所有人呼叫的,當微服務多的時候,或者呼叫其他微服務的時候,會出現一些問題

所以需要去yml配置中新增 —誰需要掉用就寫誰的

#微服務的名稱
USERSERVICE:
  ribbon:
  NFLoadBalancerRuleClassName: rule.MyRule

當如果都需要的時候就在main方法添加個bean

在這裡插入圖片描述

Feign呼叫

這裡在userservice中的controller層添加了一個類,取名就叫Empcontroller,這裡就用rest風格去實現

@RestController
public class EmpController {
    @GetMapping("/emp/{id}")
    //@PathVariable  獲取路勁引數
    public Emp queryEmp(@PathVariable String id){
        Emp emp=new Emp();
        emp.setId(id);
        emp.setName("張三******"+id);
        return emp;
    }

    @PostMapping("/emp")
    public Result add(@RequestBody Emp emp){
       Result result=new Result();
       result.setCode(1);
       result.setMsg(emp.getId()+"----"+emp.getName());
       return result;
    }
    @DeleteMapping("/emp/{id}")
    public Result del(@PathVariable String id){
        Result result=new Result();
        result.setCode(1);
        result.setMsg(id);
        return result;
    }
    @PutMapping("/emp/{id}")
    public Result update(@PathVariable String id,@RequestBody Emp emp){
        Result result=new Result();
        result.setCode(1);
        result.setMsg("修改成功");
        return result;
    }
}

新建了一個新的微服務,entity 可以從上面複製,yml也直接複製就好,不需要改動
在這裡插入圖片描述

  • 注意userviewF中需要多新增一個屬於Feign的註解@EnableFeignClients
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@RestController
public class UserViewF {

    public static void main(String[] args) {
        new SpringApplicationBuilder(UserViewF.class).web(true).run(args);
    }

}
  • 因為feign是面向介面程式設計,所以添加個介面類,注意註解@FeignClient(name=“連線的服務名”)
@FeignClient(name="USERSERVICE")
public interface EmpFeign {

    @GetMapping("/emp/{id}")
    //@PathVariable  獲取路勁引數
    public Emp queryEmp(@PathVariable("id") String id);

    @PostMapping("/emp")
    public Result add(Emp emp);

    @DeleteMapping("/emp/{id}")
    public Result del(@PathVariable("id") String id);

    @PutMapping("/emp/{id}")
    public Result update(@PathVariable("id") String id,@RequestBody Emp emp);

}
@RestController
public class EmpController {

    @Autowired
    EmpFeign ef;

    @GetMapping("/query")
    public Emp queryEmp(){
        String id="1";
        Emp emp=ef.queryEmp(id);
        return emp;
    }

    @GetMapping("/add")
    public Result add(Emp emp){
        Result add = ef.add(emp);
        return add;
    }
    @GetMapping("/del")
    public Result del(){
        String id="1";
        Result del = ef.del(id);
        return del;
    }
    @GetMapping("/update")
    public Result update(Emp emp){
        String id="1";
        Result del = ef.update(id,emp);
        return del;
    }
}

沒有連線資料庫,在url地址直接輸入測試